簡體   English   中英

Java8:如何轉換地圖 <X, List<Y> &gt;到地圖 <Y,X> 使用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

使用我編寫的免費StreamEx庫真的很難過:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM