使用Java 8流过滤和收集嵌套的集合元素

crm*_*ham 5 java functional-programming java-8 java-stream

我有一个Parent对象集合,每个对象都有一个Child元素集合,例如:

public class Parent {
    private Collection<Child> children;
}

public class Child {
    private String type;
}
Run Code Online (Sandbox Code Playgroud)

我如何使用Java 8函数式编程来过滤和收集Child类型等于'A' 的集合?

我尝试过以下方法:

Collection<Child> filteredChildren = parents.stream()
                                        .forEach(p ->
                                            filteredChildren.addAll(p.getChildren().stream()
                                                          .filter(c -> c.getType().equals("A"))
                                                          .collect(Collectors.toList()))
                                        );
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

变量'filteredChildren'初始值设定项'parents.stream().forEach(p - > ...'冗余少......(⌘F1)此检查指出变量值在赋值后从未使用过的情况,即: - 赋值后永远不会读取变量OR - 在下一个变量读取OR之前,该值总是被另一个赋值覆盖 - 变量初始值设定项是冗余的(出于上述两个原因之一)

如何按类型过滤嵌套集合并收集它们?

Era*_*ran 7

forEach在代码中使用终端Stream操作是错误的,因为它不产生输出,因此您无法将其分配给filteredChildren变量.

使用flatMap以获得Stream所有Child实例的所有实例(按类型筛选)的平面Parent,然后收集到List:

Collection<Child> filteredChildren = 
    parents.stream()
           .flatMap(p -> p.getChildren()
                          .stream()
                          .filter(c -> c.getType().equals("A")))
           .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)