列表列表和 Java 8

G S*_*noy 3 java-8 java-stream

我有一个 R 类列表和其他 P 类列表

List<R> rList = getRListFromDb();
Run Code Online (Sandbox Code Playgroud)

我想获取另一个列表中的所有 P 对象

List<P> result = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我尝试了这些,但给了我 Class cast 异常,说 P 类不能转换为 R 类。顺便说一下,我看到了下面给出的问题,但尝试过但无法弄清楚。

如何将列表列表转换为 Java 8 中的列表?

1. rList.stream().map(R::getP).flatMap(List::stream).forEach(result::addAll);
2. rList.forEach(r -> result.addAll(r.getP()));
Run Code Online (Sandbox Code Playgroud)

我想知道这里有什么不正确,也想知道在 Java 8 中完成这项工作的不同方法。

Era*_*ran 5

rList.stream().map(R::getP).flatMap(List::stream).forEach(result::addAll);
Run Code Online (Sandbox Code Playgroud)

如果您不使用flatMap(因为addAll需要 a Collection,但flatMap将您Stream<List<P>>Stream<P>.

这会起作用:

rList.stream().map(R::getP).forEach(result::addAll);
Run Code Online (Sandbox Code Playgroud)

有了flatMap它应该是:

rList.stream().map(R::getP).flatMap(List::stream).forEach(result::add);
Run Code Online (Sandbox Code Playgroud)

也就是说,正确的方法是使用collect

List<P> result = rList.stream()
                      .map(R::getP)
                      .flatMap(List::stream)
                      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

或者

List<P> result = rList.stream()
                      .flatMap(r -> r.getP().stream())
                      .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)