class A {
List<B> b;
}
class B{
boolean flag;
B(boolean flag) {
this.flag = flag;
}
//getter setter
}
B b1 = new B(true);
B b2 = new B(true);
B b3 = new B(false);
List<B> list1 = new ArrayList<>();
list1.add(b1);
list1.add(b2);
list1.add(b3);
Set<A> a = new HashSet<>();
a.add(list1);
有一组对象A。
对象 A 包含对象 B 的列表。B 有一个 boolean 属性名称 'flag' 使用 java 8 流 API,如何过滤上面的集合,使其仅包含 boolean 标志为 true 的 B 列表。 即 b3 应该从 list1 中删除。 为简单起见,只需添加单个值。
最佳答案
你有一个类 A
其中包含 B
的列表;目标是在每个 A
中删除, 所有 B
符合条件。
第一个解决方案是创建一个流 A
s 并将它们中的每一个映射到一个新的 A
B
的列表在哪里被过滤了。假设有一个构造函数A(List<B> b)
和适当的 setter/getter ( List<B> getB()
在类 A
; boolean isFlag()
在类 B
),你可以:
Set<A> set = new HashSet<>();
Set<A> filtered =
set.stream()
.map(a -> new A(a.getB().stream().filter(B::isFlag).collect(Collectors.toList())))
.collect(Collectors.toSet());
如果您可以修改 B
的列表,则可以使用第二种解决方案。就地,而不是创建一个新的。在这种情况下,您可以:
set.forEach(a -> a.getB().removeIf(b -> !b.isFlag()));
这将删除所有 B
标志在哪里 false
对于每个 A
.
关于java - 如何使用 Java 8 Stream API 过滤集合中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37729815/