![](/img/trans.png)
[英]How to convert Map<X, Map<Y,Z>> to Map<Y, Map<X,Z>> using Java8 stream
[英]Java8: How to Convert Map<X, List<Y>> to Map<Y,X> using Stream?
我是Java8的新手。 我想解決的一個問題是使用Stream將Map>轉換為Map。 例如:
input: {A => [B, C, D], E => [F]}
output: {B => A, C => A, D => A, F => E}
我們假設List中沒有重復的值。 如何在java 8流中以優雅的方式做到這一點?
干杯,魏
如果你想要一個沒有forEach()
的解決方案,你可以這樣做:
Map<Integer, String> pam =
map.entrySet().stream()
.flatMap(x -> x.getValue().stream().map(v -> new AbstractMap.SimpleEntry<>(v, x.getKey())))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
對於每個條目,如"3"-> [3,4,5,6]
一個條目流,如3->3,4->3,5->3,6->3
,使用flatMap
它可以是展平為一個流,然后Collectors.toMap()
創建最終的Map
。
EntryStream.of(map).invert().flatMapKeys(Collection::stream).toMap();
這里的EntryStream.of(map)
創建了一個映射條目流,它通過附加操作進行擴展; invert()
交換鍵和值, flatMapKeys()
平鍵,保持值不變, toMap()
將結果條目收集回map。
假設
Map<String, List<Integer>> map = new HashMap<>();
Map<Integer,String> pam = new HashMap<>();
這將做你想要的
map.entrySet().stream().forEach(e -> e.getValue().stream().forEach(v -> pam.put(v, e.getKey())));
這利用了Set<E>
從Collection
實現stream()
的事實。 其余的只是把東西塞進正確的地方。
或者,正如@ user140547(謝謝)所建議的那樣,一個更簡單的解決方案
map.forEach((k,v) -> v.forEach(vv -> pam.put(vv, k)));
正如@JimGarrison使用Map.forEach所指出的那樣容易得多
input.forEach( (key,value)-> value.forEach(vvalue -> output.put(vvalue, key)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.