java 流嵌套对象
java stream nested objects
我有一个如下的对象和一个按照对象类型的列表:
public class A{
private String x;
private String y;
private List<A> child = new ArrayList<>();
}
我想做的是将列表展平并制作一个对象 A 及其子项的列表;
目前我正在按照以下三个单独的语句进行操作:
List<A> ChildElements = map.values()
.stream()
.flatMap(entry -> entry.getChild().stream())
.collect(Collectors.toList());
List<A> RootElements = map.values()
.stream()
.collect(Collectors.toList());
List<A> elements = Stream.concat(ChildElements.stream(),RootElements.stream()).collect(Collectors.toList());
我想知道上面是否可以在一个语句中重构。
谢谢。
一种方法如下:
map.values()
.stream()
.flatMap(entry -> {
Stream<A> entryStream = Stream.of(entry);
Stream<A> childStream = entry.getChild().stream();
return Stream.concat(entryStream, childStream);
})
.collect(Collectors.toList());
可以在 flatMap
:
中立即连接流
List<A> flattened = map.values()
.stream()
.flatMap(root -> Stream.concat(
Stream.of(root),
root.getChildren().stream()
))
.collect(Collectors.toList());
但是,初始实现提供了结果中元素的另一种顺序:
initial: child11, child12,... child1N1, child21,... child2N2, ...childMNm, root1,... rootM
flattened: root1, child11,... child1N1,... rootM, childM1... childMNm
我有一个如下的对象和一个按照对象类型的列表:
public class A{
private String x;
private String y;
private List<A> child = new ArrayList<>();
}
我想做的是将列表展平并制作一个对象 A 及其子项的列表;
目前我正在按照以下三个单独的语句进行操作:
List<A> ChildElements = map.values()
.stream()
.flatMap(entry -> entry.getChild().stream())
.collect(Collectors.toList());
List<A> RootElements = map.values()
.stream()
.collect(Collectors.toList());
List<A> elements = Stream.concat(ChildElements.stream(),RootElements.stream()).collect(Collectors.toList());
我想知道上面是否可以在一个语句中重构。
谢谢。
一种方法如下:
map.values()
.stream()
.flatMap(entry -> {
Stream<A> entryStream = Stream.of(entry);
Stream<A> childStream = entry.getChild().stream();
return Stream.concat(entryStream, childStream);
})
.collect(Collectors.toList());
可以在 flatMap
:
List<A> flattened = map.values()
.stream()
.flatMap(root -> Stream.concat(
Stream.of(root),
root.getChildren().stream()
))
.collect(Collectors.toList());
但是,初始实现提供了结果中元素的另一种顺序:
initial: child11, child12,... child1N1, child21,... child2N2, ...childMNm, root1,... rootM
flattened: root1, child11,... child1N1,... rootM, childM1... childMNm