簡體   English   中英

如何使用流將 map 值聚合到集合中

[英]How to aggregate map values into set using streams

有沒有一些簡單的方法可以將Map<Key, List<Value>>轉換為Set<Value>以獲得一組嵌套在 map 中的所有唯一元素? 我知道這應該可以使用reduceflatmap來實現,但我正在努力尋找正確的組合。

我知道我可以使用 for 循環執行此操作,但我想使用流執行此操作。

Set<Value> set = map.values().stream()
                             .flatMap(List::stream)
                             .collect(Collectors.toSet());

Set不會添加已經存在的 Value,因此您必須確保您的Value對象具有正確的equals()方法。


編輯: List::stream根據這篇文章在功能上等同於list -> list.stream()

首先,您必須確保您的 Value class 實現equalshashCode

我會 go 與平面圖組合。

它看起來像那樣

Set<Value> values = map.values().stream()
                                .flatMap(List::stream)
                                .collect(Collectors.toSet())

集合中的 Map 值以及排序數據。

public class Test {
    public static void main(String[] args) {

        Map<Integer, List<String>> dataInMap = new HashMap<>();

        dataInMap.put(100, Arrays.asList("data8","data9","data3","data4","data5"));
        dataInMap.put(200, Arrays.asList("data5","data6","data7"));
        dataInMap.put(300, Arrays.asList("data7","data8","data9"));
        dataInMap.put(400, Arrays.asList("data1","data2"));

        Set<String> uniqueDataInSet = dataInMap.values()
                        .stream()
                        .flatMap(Collection::stream)
                        .sorted()
                        .collect(Collectors.toCollection(LinkedHashSet::new));
        System.out.println("uniqueDataInSet:: " + uniqueDataInSet);
      //uniqueDataInSet:: [data1, data2, data3, data4, data5, data6, data7, data8, data9]
    }
}

謝謝吉達爾_

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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