[英]How to convert Map<String, List<String>> to Set<String> using streams?
[英]Convert List of Set<String> to Set<String> using JAVA 8 Streams
是否有可能使用 java 8 個流將集合列表轉換為集合。 這是我的清單:
// Get Header Columns to display in EXCEL FILE
List<Set<String>> keysQuery = listExtractQglobal.parallelStream()
.map(m -> m.keySet()).distinct().collect(Collectors.toList());
謝謝
只需使用 flatMap
Set<String> a = keysQuery.stream().flatMap(s -> s.stream()).collect(Collectors.toSet());
如評論所示,您還可以將 lambda function 替換為 lambda 參考
Set<String> a = keysQuery.stream().flatMap(Set::stream).collect(Collectors.toSet());
假設這是您創建列表的方式:
List<Set<String>> keysQuery = listExtractQglobal.parallelStream()
.map(m -> m.keySet()).distinct().collect(Collectors.toList());
您實際上可以避免不必要的收集到列表並收集到集合:
Set<String> keysQuery = listExtractQglobal.parallelStream()
.map(Map::keySet)
.distinct()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
順便說一句,我不確定你為什么需要這里的distinct
。 您是否在所有鍵集中尋找不同的集合或不同的鍵? 在后一種情況下,您可以簡單地省略distinct()
,因為結果Set
根據定義包含不同的值:
Set<String> keysQuery = listExtractQglobal.parallelStream()
.map(Map::keySet)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
我會使用java-16中的Stream#mapMulti
而不是Stream#flatMap
因為它有可能創建空流或非常小的流的開銷
Set<String> keysQuery = listExtractQglobal.parallelStream()
.map(Map::keySet)
.mapMulti((Set<String> set, Consumer<String> consumer) -> {
set.forEach(consumer::accept);
})
.collect(Collectors.toSet());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.