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 类。顺便说一下,我看到了下面给出的问题,但尝试过但无法弄清楚。
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 中完成这项工作的不同方法。
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)
归档时间: |
|
查看次数: |
4304 次 |
最近记录: |