如何解决使用 JAVA 8 Streams 将 Set<String> 列表转换为 Set<String>
是否有可能使用 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 引用替换 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());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。