将嵌套循环重构为 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"