【问题标题】:How to filter nested loops using Java 8 streams and filters?如何使用 Java 8 流和过滤器过滤嵌套循环?
【发布时间】:2017-05-09 00:16:01
【问题描述】:

我有两个简单的 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 岁的所有父母?

【问题讨论】:

    标签: java java-8 java-stream


    【解决方案1】:

    有很好的方法Collection.removeIf(Predicate&lt;? super E&gt; 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;
        }
    }
    

    查看更多:Method referencesCollection.stream().forEach() vs Collection.forEach()?

    【讨论】:

    • 确保 parent.getChildren() 返回父对象中列表的副本,否则父对象中的子对象列表将发生变化。
    • @WimDeblauwe 如果parent.getChildren() 返回一个副本,那么这个应对将不会做任何事情。
    【解决方案2】:

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

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

    【讨论】:

    • 当然可以。但一些建议:stream() on parentList 在这里没用,这种过滤更难阅读和维护。
    • @Andrii 我也喜欢你的解决方案,而不是我的。但是你能解释一下为什么parentList 上的stream() 没用吗?它没有实现目标吗?我在实现中有错误吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多