我有一个循环,它可以执行我想要的操作-它将类型为A
的对象添加到results
列表中:
ArrayList<A> results = new ArrayList<>();
for (A a: listOfA) {
for (B b : a.getListOfB()) {
if ("myString".equals(b.getMyString())) {
results.add(a);
}
}
}
现在我想使用Java8流重构我的代码,我提出了这个解决方案,因为它收集的对象类型是B
而不是A
-List<A> results = ...
显然是错误的:
List<A> results = listOfA.stream()
.flatMap(a -> a.getListOfB().stream())
.filter(b -> "myString".equals(b.getMyString()))
.collect(Collectors.toList());
如何使用Java 8流收集类型为A
的列表?
我在SO中找到了很多寻找[java]嵌套foreach流的结果,但我找不到任何适合我需求的结果。
此处不需要flatMap
。只需在Stream<A>
上应用filter
即可。
List<A> results =
listOfA.stream()
.filter(a -> a.getListOfB()
.stream()
.anyMatch(b -> "myString".equals(b.getMyString())))
.collect(Collectors.toList());
这是假设您不想将A
的实例多次添加到List
,如果它有多个与"myString"
匹配的B
实例。