вложенные объекты Java-потока

avatar
ashley
8 августа 2021 в 18:51
112
2
1

У меня есть следующий объект и список в соответствии с типом объекта:

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()); 

Я хотел узнать, можно ли реорганизовать приведенное выше в одном выражении.

Спасибо.

Источник
Turing85
8 августа 2021 в 18:54
0

Зачем вам все это в одном заявлении?

ashley
8 августа 2021 в 18:55
0

@ Turing85 просто для моего сведения и посмотреть, можно ли это написать меньшим количеством строк кода.

Turing85
8 августа 2021 в 19:00
0

map.values().stream().flatMap(entry -> { final ArraryList<A> result = new ArrayList>(entry.getChild().stream())); result.add(entry); return result.stream(); }).collect(Collectors.toList());

Ответы (2)

avatar
Nowhere Man
8 августа 2021 в 20:08
1

Можно объединить потоки сразу в 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
avatar
Gaël J
8 августа 2021 в 19:00
1

Один из способов будет выглядеть следующим образом:

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());