[英]How to aggregate map values into set using streams
有沒有一些簡單的方法可以將Map<Key, List<Value>>
轉換為Set<Value>
以獲得一組嵌套在 map 中的所有唯一元素? 我知道這應該可以使用reduce
或flatmap
來實現,但我正在努力尋找正確的組合。
我知道我可以使用 for 循環執行此操作,但我想使用流執行此操作。
Set<Value> set = map.values().stream()
.flatMap(List::stream)
.collect(Collectors.toSet());
Set
不會添加已經存在的 Value,因此您必須確保您的Value
對象具有正確的equals()
方法。
編輯: List::stream
根據這篇文章在功能上等同於list -> list.stream()
。
首先,您必須確保您的 Value class 實現equals
和hashCode
。
我會 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.