【问题标题】:Java stream flatMap with keeping first and second level objects in streamJava流flatMap,将第一级和第二级对象保留在流中
【发布时间】:2020-03-23 02:25:38
【问题描述】:

我想知道如何使用 Java Stream API 来展平一个结构,其中我有一个对象和嵌套在其中的相同类型对象的集合。

我的意思是我有一个Component 类,它有一个List<Component> 类型的字段。 我想做的是找到一个与以下代码相同的简洁的流式解决方案(我需要以所有组件和嵌套子组件的列表结束)。

List<Component> components = getComponents(id);
List<Component> componentsAndSubcomponents = new ArrayList<>();
for (Component component : components) {
  componentsAndSubcomponents.add(component);
  componentsAndSubcomponents.addAll(component.getSubComponents());
}

【问题讨论】:

    标签: java java-stream flatmap


    【解决方案1】:

    您可以将flatMapStream 串联使用:

    List<Component> componentsAndSubcomponents =
        components.stream()
                  .flatMap(c -> Stream.concat(Stream.of(c),c.getSubComponents().stream()))
                  .collect(Collectors.toList());
    

    这会将每个Component 映射到包含Component 后跟其所有子组件的Stream,并将所有这些Streams 扁平化为扁平Stream&lt;Component&gt;,以收集到一个List&lt;Component&gt;.

    【讨论】:

      【解决方案2】:

      一个简单的解决方案是动态创建一个内部流,如下所示:

      List<Component> result = components.stream()
          .flatMap(comp -> 
              Stream.concat(Stream.of(comp), comp.getSubComponents().stream()))
          .collect(Collectors.toList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        相关资源
        最近更新 更多