![](/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.