我有两个简单的 POJO:
public class Parent {
String name;
List<Child> children = new ArrayList<>();
void addChild(Integer age) { children.add(new Child(age)); }
}
public class Child {
Integer age;
}
然后我生成一些数据,为父母 100 个孩子添加:
List<Parent> parentList = new ArrayList<>();
Parent first = new Parent("first");
for (int i = 0; i < 100; ++i) { first.addChild(i); }
parentList.add(first);
我的目标是消除所有十岁以下的儿童:
parentList.stream().forEach(parent -> {
parent.setChildren(getChildrenOlderThan(parent));
});
List<Child> getChildrenOlderThan10(Parent parent) {
return parent.getChildren().stream()
.filter(child -> child.getAge() > 10)
.collect(Collectors.toList());
}
最后我列出了十岁以上的孩子。但我不想编写一个单独的方法 getChildrenOlderThan。
如何仅使用单个流获取所有列出十岁以上儿童的家长?
Collection.removeIf(Predicate<? super E> filter)
方法。
例如:
class Example {
public static void main(String[] args){
List<Parent> parentList = new ArrayList<>();
// init parents with children
parentList.forEach(parent ->
parent.getChildren().removeIf(Example::childOlderThan10)
);
}
static boolean childOlderThan10(Child child) {
return child != null && child.getAge() > 10;
}
}
查看更多:方法参考、
Collection.stream().forEach()
vs Collection.forEach()
?
您可以像这样内联 getChildreanOlderThan 方法:
parentList.stream().forEach(parent -> {
parent.setChilds(parent.getChildren().stream()
.filter(child -> child.getAge() > 10)
.collect(Collectors.toList()));
});
您可以使用 Flatmap 获取 > 10 的孩子列表
List childList =parentList.stream().flatMap(par->par.getChildren().stream()) .filter(child->child.age>10).collect(Collectors.toList());