将嵌套循环重构为 Java 8 个收集外部对象的流
Refactoring a nested loop into Java 8 streams collecting the outer objects
我有一个循环可以做我想做的事情——它将 A
类型的对象添加到 results
列表中:
ArrayList<A> results = new ArrayList<>();
for (A a: listOfA) {
for (B b : a.getListOfB()) {
if ("myString".equals(b.getMyString())) {
results.add(a);
}
}
}
现在我想使用 Java 8 个流来重构我的代码,我想出了这个我一直坚持的解决方案,因为它收集 B
类型的对象而不是 [=13] =] - 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] nested foreach stream 但我找不到适合我需要的任何结果。
这里不需要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
,如果它有多个 B
实例匹配 "myString"
。
我有一个循环可以做我想做的事情——它将 A
类型的对象添加到 results
列表中:
ArrayList<A> results = new ArrayList<>();
for (A a: listOfA) {
for (B b : a.getListOfB()) {
if ("myString".equals(b.getMyString())) {
results.add(a);
}
}
}
现在我想使用 Java 8 个流来重构我的代码,我想出了这个我一直坚持的解决方案,因为它收集 B
类型的对象而不是 [=13] =] - 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] nested foreach stream 但我找不到适合我需要的任何结果。
这里不需要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
,如果它有多个 B
实例匹配 "myString"
。