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之前,该值总是被另一个赋值覆盖 - 变量初始值设定项是冗余的(出于上述两个原因之一)
如何按类型过滤嵌套集合并收集它们?
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)