如何使用 Java 8 流流式传输带有集合的地图?



我想使用 Java 8 流流式传输带有集合的映射。

例如,具有以下数据:

Map<String, Collection<Integer>> data;

我想回顾一下使用相应的键字符串处理每个整数值的元素。例如:

data.keyValueStream((k,v)-> ...)

知道如何实现这一目标吗?谢谢。

*关于"你为什么需要它?"这个问题,这可能是一堆原因,我不确定它是否重要。无论如何,我会和你"流动"...我的特定方案是将所有值在其特定键下批量插入到数据库中。让我们保持一个一般的Java 8流问题...

您可以将Map<String, Collection<Integer>>映射到List<Map.Entry<String, Integer>>

data.entrySet().stream()
.flatMap(e -> e.getValue().stream().map(v -> new HashMap.SimpleEntry<>(e.getKey(), v)))
.forEach(e -> System.out.printf("key %s val %d%n", e.getKey(), e.getValue()));

或:

data.forEach((k, v) -> v.forEach(n -> System.out.printf("key %s val %d%n", k, n)));

我知道您询问流版本,但是如果您不打算使用并行性,那么最简单且可能更有效的选项是使用嵌套循环。这样,您可以避免花费时间和空间为每个<Key,CollectionItem>对创建临时实例。

相反,您可以使用

for (Map.Entry<String, Collection<Integer>> entry : map.entrySet()){
String key = entry.getKey();
for (Integer number : entry.getValye()){
//here we have access to <key, number> pair, 
//handle them as you wish;
}
}

虽然这可能有点明显,但你也可以写:

map.forEach((k, v) -> v.forEach(s -> System.out.println(k + "  " + s)))

例如,在 Java 9 中。

Map< String , Collection< Integer > > map =
Map.ofEntries(
Map.entry( "alpha" , List.of( 1 , 2 , 3 ) ) ,
Map.entry( "beta" , List.of( 4 , 5 , 6 ) ) ,
Map.entry( "gamma" , List.of( 7 , 8 , 9 ) )
)
;
map.forEach( ( k , v ) -> {
v.forEach( s -> System.out.println( k + "  " + s ) );
}
);

流式处理仅处理单个值,因此您无法获取keyValueStream((k,v)-> ...),但您可以获取x元组/对keyValueStream(x -> ...)

由于您从Map开始,它可以流式传输Entry对象(键/值对(,并且您希望在 lambda 中有一个键/值对,因此Entry对象流似乎是合适的。

这意味着您只想平展嵌套集合,例如:

import java.util.AbstractMap.SimpleEntry;
data.entrySet()
.stream()
.flatMap(e -> e.getValue().stream().map(v -> new SimpleEntry<>(e.getKey(), v)))
// At this point you have a Stream<Entry<String, Integer>> so you can e.g. do this:
.forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()))
;

最新更新