【问题标题】:Convert List of Set<String> to Set<String> using JAVA 8 Streams使用 JAVA 8 Streams 将 Set<String> 列表转换为 Set<String>
【发布时间】:2021-06-22 04:32:20
【问题描述】:

是否有可能使用 java 8 流将集合列表转换为集合。 这是我的清单:

// Get Header Columns to display in EXCEL FILE

    List<Set<String>> keysQuery = listExtractQglobal.parallelStream()
                    .map(m -> m.keySet()).distinct().collect(Collectors.toList()); 

谢谢

【问题讨论】:

  • listExtractQglobal 变量的类型是什么?
  • 地图列表:列表>

标签: java collections java-8 java-stream flatmap


【解决方案1】:

只需使用平面地图

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());

【讨论】:

  • 或者使用方法参考:.flatMap(Set::stream).
  • @JavaProgramer 问题解决请采纳答案
【解决方案2】:

假设这是您创建列表的方式:

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());

【讨论】:

    【解决方案3】:

    我会使用 中的 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()); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多