在这种特定情况下如何使用Streams获取列表列表?

时间:2018-05-30 12:59:44

标签: java list java-8 java-stream grouping

我有一些类如下:

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 :(得分:7)

如果您需要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());