如何使用 Java 8 流和过滤器过滤嵌套循环?

问题描述 投票:0回答:3

我有两个简单的 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。

如何仅使用单个流获取所有列出十岁以上儿童的家长?

java java-8 java-stream
3个回答
6
投票

有一个很好的方法

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()


1
投票

您可以像这样内联 getChildreanOlderThan 方法:

parentList.stream().forEach(parent -> {
    parent.setChilds(parent.getChildren().stream()
            .filter(child -> child.getAge() > 10)
            .collect(Collectors.toList()));
    });

0
投票

您可以使用 Flatmap 获取 > 10 的孩子列表

List childList =parentList.stream().flatMap(par->par.getChildren().stream()) .filter(child->child.age>10).collect(Collectors.toList());

© www.soinside.com 2019 - 2024. All rights reserved.