将地图流<K,V>收集到地图<K,列表<V >>

ver*_*uyi 5 java java-8 java-stream collectors

我有一个Stream< Map< K, V > >,我试图将这些地图合并在一起,但保留列表中的重复值,所以最终的类型将是Map< K, List<V> >.有没有办法做到这一点?我知道toMap收集器有一个二进制函数来基本上选择返回哪个值,但是它能跟踪转换后的列表吗?

如果aStream< Map< String, Int > >

a.flatMap(map -> map.entrySet().stream()).collect(
    Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (val1, val2) -> ??
);
Run Code Online (Sandbox Code Playgroud)

NoD*_*und 8

使用groupingBy:看看javadoc,但在你的情况下它应该是这样的:

a.flatMap(map -> map.entrySet().stream())
 .collect(
   Collectors.groupingBy(
     Map.Entry::getKey, 
     HashMap::new, 
     Collectors.mapping(Map.Entry::getValue, toList())
   )
);
Run Code Online (Sandbox Code Playgroud)

要么:

a.map(Map::entrySet).flatMap(Set::stream)
 .collect(Collectors.groupingBy(
     Map.Entry::getKey, 
     Collectors.mapping(Map.Entry::getValue, toList())
   )
);
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用[`groupingBy(Function,Collector)`](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#groupingBy-java.util.function.函数-java.util.stream.Collector-)并省略`HashMap :: new`.此外,对于那些喜欢方法引用的人,你可以做`a.map(Map :: entrySet).flatMap(Set :: stream)`. (3认同)