将嵌套循环重构为收集外部对象的Java 8流



我有一个循环,它可以执行我想要的操作-它将类型为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实例。

最新更新