使用Java 8 Streams从列表中仅获取所需对象

Man*_*Joy 8 java arraylist java-8 java-stream

考虑Parent具有属性的类attrib1,attrib2以及List<Child>具有相应的getter和setter的child.

Child是另一个具有五个属性的类attrib1- attrib5具有相应的getter和setter.

现在我创建了一个List<Parent>父母.然后我想过滤掉List<Parent>以下条件: - Child.Attrib1 > 10;

所以我用Java 8流创建了以下查询.

parent.stream().filter(e -> e.getChild().stream().anyMatch(c -> c.getAttrib1() > 10));
Run Code Online (Sandbox Code Playgroud)

但问题是我会在每个Parent对象中获得所有孩子.在这里,我想只获得那些List<Child>符合给定条件的子对象.

如何删除List中不遵守该条件并获取新列表的所有子对象.

Dak*_*rra 6

Stream<Child>如果你想收到所有孩子,你需要的是一个.以下表达式可能会起到作用:

parents.stream().flatMap(e -> e.getChildren().stream()).filter(c -> c.getAttrib1() > 10)

这应该返回get属性值大于10的列表中所有父项的所有子项.

如果要通过删除条件失败的所有子元素来更新父列表,可以执行以下操作:

parents.forEach(p -> p.getChildren().removeIf(c -> c.getAttrib1() > 10));

这不会创建新列表.相反,它会更新parents列表本身.

  • 一个完全不同的问题:(.更新答案. (3认同)