我有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-变量 初始化程序是多余的(由于上述两个原因之一)
如何按类型过滤嵌套集合并收集它们?
答案 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());