簡體   English   中英

如何使用Java 8流和過濾器過濾嵌套循環?

[英]How to filter nested loops using Java 8 streams and filters?

我有兩個簡單的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);

我的目標是刪除所有10歲以下的孩子:

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。

如何僅使用單個流使所有列表兒童超過10歲的父母?

有一個很好的方法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()Collection.forEach()嗎?

您可以像這樣內聯方法getChildreanOlderThan:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM