Java 8中列表的两级过滤

7
我有一个对象列表aList,其中包含类A的对象。这个aList是另一个列表bList中每个元素的成员。每个元素b都是类B的实例。类B的结构如下所示:
class B {
    String status;
    String name;
}

A 的结构如下所示:

class A {
    List<B> bList;
    String status;
}

现在我想按如下方式过滤aList
仅当a.status =“Active” 且aList的每个“Active” a都包含仅为“Active”的b对象的bList时,最终列表aListResult应仅包含对象a。
在Java 8中如何实现这一点,我无法想出解决方案。

你希望输出列表仅包含已激活所有相关B实例的A实例,还是想要改变A实例并删除对非激活B实例的引用? - Eran
是的,@Eran 正确。 - Joy
1个回答

11

我假设您想要输出仅包含所有相关B实例均为活动状态的活动A实例的列表:

List<A> aList = ...;
List<A> aListResult = 
    aList.stream()
        .filter(a -> a.getStatus().equals("Active"))
        .filter(a -> a.bList.stream().allMatch(b -> b.getStatus().equals("Active")))
        .collect(Collectors.toList());

3
嗨Eran,很好的回答,像往常一样;) 关于使用“equals”方法的用法,我想提醒一下...每当您想要检查与常量(在本例中为“Active”)的相等性时,最好检查变量是否等于常量,如“Active”.equals(a.getStatus())所示。这是为了避免在a.getStatus()返回null的情况下出现NullPointerException。 - fps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接