我有一个 Stream< Map< K, V > >
我正在尝试将这些 map 合并在一起,但在列表中保留重复值,因此最终类型将是 Map< K, List<V> >
.有没有办法做到这一点?我知道 toMap
收集器有一个二元函数来基本上选择返回哪个值,但它能跟踪转换后的列表吗?
即
如果a
是 Stream< Map< String, Int > >
a.flatMap(map -> map.entrySet().stream()).collect(
Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (val1, val2) -> ??
);
最佳答案
使用groupingBy : 请参阅 javadoc,但在您的情况下应该是这样的:
a.flatMap(map -> map.entrySet().stream())
.collect(
Collectors.groupingBy(
Map.Entry::getKey,
HashMap::new,
Collectors.mapping(Map.Entry::getValue, toList())
)
);
或者:
a.map(Map::entrySet).flatMap(Set::stream)
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, toList())
)
);
关于java - 收集 Map<K,V> 到 Map<K,List<V>> 的流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41602519/