Java 将第一级和第二级对象保留在流中的流 flatMap
Java stream flatMap with keeping first and second level objects in stream
我想知道如何使用 Java Stream API 来展平结构,其中我有一个对象和嵌套在其中的相同类型对象的集合。
我的意思是我有一个 Component
class,它有一个 List<Component>
类型的字段。
我想做的是找到一个简洁的流式解决方案,它与以下代码相同(我需要以所有组件和嵌套子组件的列表结束)。
List<Component> components = getComponents(id);
List<Component> componentsAndSubcomponents = new ArrayList<>();
for (Component component : components) {
componentsAndSubcomponents.add(component);
componentsAndSubcomponents.addAll(component.getSubComponents());
}
您可以将 flatMap
与 Stream
串联使用:
List<Component> componentsAndSubcomponents =
components.stream()
.flatMap(c -> Stream.concat(Stream.of(c),c.getSubComponents().stream()))
.collect(Collectors.toList());
这会将每个 Component
映射到包含 Component
及其所有子组件的 Stream
,并将所有这些 Stream
展平为一个平Stream<Component>
,待收成List<Component>
.
一个简单的解决方案是即时创建内部流,如:
List<Component> result = components.stream()
.flatMap(comp ->
Stream.concat(Stream.of(comp), comp.getSubComponents().stream()))
.collect(Collectors.toList());
我想知道如何使用 Java Stream API 来展平结构,其中我有一个对象和嵌套在其中的相同类型对象的集合。
我的意思是我有一个 Component
class,它有一个 List<Component>
类型的字段。
我想做的是找到一个简洁的流式解决方案,它与以下代码相同(我需要以所有组件和嵌套子组件的列表结束)。
List<Component> components = getComponents(id);
List<Component> componentsAndSubcomponents = new ArrayList<>();
for (Component component : components) {
componentsAndSubcomponents.add(component);
componentsAndSubcomponents.addAll(component.getSubComponents());
}
您可以将 flatMap
与 Stream
串联使用:
List<Component> componentsAndSubcomponents =
components.stream()
.flatMap(c -> Stream.concat(Stream.of(c),c.getSubComponents().stream()))
.collect(Collectors.toList());
这会将每个 Component
映射到包含 Component
及其所有子组件的 Stream
,并将所有这些 Stream
展平为一个平Stream<Component>
,待收成List<Component>
.
一个简单的解决方案是即时创建内部流,如:
List<Component> result = components.stream()
.flatMap(comp ->
Stream.concat(Stream.of(comp), comp.getSubComponents().stream()))
.collect(Collectors.toList());