Java 流 flatMap 将第一级和第二级对象保留在流中

标签 java java-stream flatmap

我想知道如何使用 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());
}

最佳答案

您可以使用flatMapStream连接:

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

这将映射每个 Component进入Stream其中包含 Component接下来是它的所有子组件,并将所有这些 Stream 展平进入公寓Stream<Component> ,收集到 List<Component> .

关于Java 流 flatMap 将第一级和第二级对象保留在流中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59071751/

相关文章:

java - 字符串文字是否有资格进行垃圾回收。以这种方式?

具有自定义逻辑的 Java 8 Stream groupingBy

java - 了解从 HashSet 生成的流中元素的顺序

Javas 流 findFirst() 的 Scala 等价物

java - 使用 Stream 展平嵌套 Hashmap

Swift:通过可选属性将可选模型数组减少为单个 Bool

java - Eclipse - 我应该在导出 APK 之前清理项目吗?

java - 游戏在导出的 jar 中以 18 fps 运行,在 Eclipse 中以 40 fps 运行?

java - 如何将来自不同项目的 JSP 文件包含到我的项目中

merge - RxSwift 中的合并和平面图运算符有什么区别