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