java - 如何使用 Java 8 Stream API 过滤集合中的列表

标签 java collections java-stream

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/

相关文章:

java - 如果静态成员不继承,那么为什么我们可以使用子类引用来访问它

java - 如果 ArrayList 对象的字段之一包含重复条目,如何修改该对象?

JSON 数组正在转换为通用列表,但未转换为通用集合。为什么?

java - 并行流哈希集

java - 如何在Java中的两个混合器之间创建 "connection"?

java - Android Google+ 使用 WebView 登录

java - 如何使用 Google Json Parsing API (Gson) 来解析我的 json 中的一些动态字段?

recursion - 如何在 Kotlin 中使用 FoldRight 递归实现 dropWhile

java - 如何使用lambda来收集java8中多个列表中具有相同索引的元素

java-8 - 如何将 Java 8 流收集到 Guava ImmutableCollection 中?