![](/img/trans.png)
[英]How to collect Stream<Map<K,V>> into Map<K,List<V>> using java 8?
[英]Collect a Stream of Map<K,V> to Map<K,List<V>>
我有一个Stream< Map< K, V > >
,我试图将这些地图合并在一起,但保留列表中的重复值,因此最终的类型是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())
)
);
这比groupingBy解决方案有点晦涩,但我只是想指出,通过提供合并功能也可以使用toMap(正如你最初设定的那样):
a.flatMap(map -> map.entrySet().stream()).collect(
Collectors.toMap(Map.Entry::getKey,
entry -> {
List<Integer> list = new ArrayList<>();
list.add(entry.getValue());
return list;
},
(list1, list2) -> {
list1.addAll(list2);
return list1;
}));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.