当前位置: 首页 > 知识库问答 >
问题:

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

游皓
2023-03-14

我有两个简单的POJOs:

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

最后,我列出了十岁以上的孩子。但是我不想写一个单独的方法。

如何得到所有的父母与名单上的孩子十岁以上只使用单一流?

共有2个答案

许安邦
2023-03-14

您可以像这样内联方法getChilrey anOlderthan:

parentList.stream().forEach(parent -> {
    parent.setChilds(parent.getChildren().stream()
            .filter(child -> child.getAge() > 10)
            .collect(Collectors.toList()));
    });
王才英
2023-03-14

有一个很好的方法< code>Collection.removeIf(谓词

例如:

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(). for各()vsCollection.for各()

 类似资料:
  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我有一个对象的集合,每个对象都有一个元素的集合,例如: 如何使用Java 8函数式编程来过滤和收集类型等于“a”的集合? 我尝试了以下方法: 但我得到以下错误: 变量'filteredChildren'初始值设定项'parents。stream()。forEach(p- 如何按类型筛选嵌套集合并收集它们?

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 我正在用Java8为一个文件编写一个解析器。使用读取该文件,并返回一个顺序的。 每一行都映射到一个数据对象,如下所示: 现在我们可以将流中的每一行映射到相应的结果: 但是,流现在包含要删除的值: 如我在中所知,如果需要结果,我如何组合映射/筛选操作?

  • 有两个具有相同结构的地图,即map1和map2,其结构为

  • 将此流收集到列表中 正如我所看到的,infinity循环有一些问题,所以peek()打印范围内的数字(12,99),这是可以的,但之后它再次打印范围内的数字(11,98),等等,你能解释一下我在哪里犯了错误吗?