Как получить список списков с использованием потоков в этом конкретном случае? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть несколько классов, как показано ниже:

Class A {
    private String name;
    private List<B> b;
    // getters and setters
}
Class B {
    private String name;
    private List<C> c;
    // getters and setters
}
Class C {
    private String name;
    private List<D> d;
    // getters and setters
}
Class D {
    // properties
    // getters and setters
}

Теперь у меня есть список типа A.Что я хочу сделать, это получить список, содержащий другие списки типа D, например:

List<List<D>>

Я пытался что-то подобное, используя flatMap:

listA.stream()
     .flatMap(s -> s.getB.stream())
     .flatMap(s -> s.getC.stream())
     .flatMap(s -> s.getD.stream())
     .collect(Collectors.toList());

Но это собирает все элементы типа D в список:

List<D>

Может кто-нибудь помочь, пожалуйста?

1 Ответ

0 голосов
/ 30 мая 2018

Если вы хотите List<List<D>>, вам нужно меньше flatMap:

List<List<D>> ds = listA.stream() // creates Stream<A>
                        .flatMap(s -> s.getB().stream()) // creates Stream<B>
                        .flatMap(s -> s.getC().stream()) // creates Stream<C>
                        .map(s -> s.getD()) // creates Stream<List<D>>
                        .collect(Collectors.toList());

или

List<List<D>> ds = listA.stream() // creates Stream<A>
                        .flatMap(s -> s.getB().stream()) // creates Stream<B>
                        .flatMap(s -> s.getC().stream()) // creates Stream<C>
                        .map(C::getD) // creates Stream<List<D>>
                        .collect(Collectors.toList());
...