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

时间:2018-07-22 10:20:48

标签: java java-8 functional-programming java-stream

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

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

public class Child {
    private String type;
}

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

我尝试了以下方法:

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

但是出现以下错误:

  

变量'filteredChildren'初始化程序   'parents.stream().forEach(p-> ...')冗余少(... F1)   检查指出了从不使用变量值的情况   赋值后,即:-变量从不被读取   赋值或-该值始终被另一个覆盖   下一个变量之前的赋值读取OR-变量   初始化程序是多余的(由于上述两个原因之一)

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

2 个答案:

答案 0 :(得分:6)

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

使用flatMap来获取所有Stream实例的所有Child实例(按类型过滤)的平面Parent,然后收集到{ {1}}:

List

答案 1 :(得分:1)

您可以做的是在父项集合上进行流式处理,展平他们的孩子并过滤type等于"A"的孩子。

parents.stream()
    .map(Parent::getChildren)
    .flatMap(Collection::stream)
    .filter(children -> "A".equals(children.getType()))
    .collect(Collectors.toList());