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

fan*_*cco 3 java java-stream

我有一个循环可以执行我想要的操作 - 它将类型的对象添加A到列表中results

ArrayList<A> results = new ArrayList<>();
for (A a: listOfA) {
  for (B b : a.getListOfB()) {
    if ("myString".equals(b.getMyString())) {
      results.add(a);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想使用 Java 8 流重构我的代码,我想出了这个解决方案,因为它收集类型B而不是A-的对象List<A> results = ...显然是错误的:

List<A> results = listOfA.stream()
  .flatMap(a -> a.getListOfB().stream())
  .filter(b -> "myString".equals(b.getMyString()))
  .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

A如何使用 Java 8 流收集类型列表?


我在寻找[java] 嵌套 foreach 流的SO 中找到了许多结果,但我找不到任何适合我需要的东西。

Era*_*ran 8

你不需要flatMap这里。只需filterStream<A>.

List<A> results = 
    listOfA.stream()
           .filter(a -> a.getListOfB()
                         .stream()
                         .anyMatch(b -> "myString".equals(b.getMyString())))
           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

这是假设您不想将A多次添加到 的实例List(如果它有多个B匹配的实例)"myString"