Java 8中列表的两级过滤

Joy*_*Joy 6 java java-8 java-stream

我有一个aList类对象列表A.这aList是另一个列表的每个元素b的成员bList.每个元素b都是类B.课程结构B如下:

class B {
    String status;
    String name;
}
Run Code Online (Sandbox Code Playgroud)

课程结构A如下:

class A {
    List<B> bList;
    String status;
}
Run Code Online (Sandbox Code Playgroud)

现在我想过滤aList如下:

最终列表aListResult应仅包含对象a,如果a.status ="Active"以及aList的每个"Active"a应bList仅包含"Active"b对象,即如果b将关联,bList当且仅当b.status ==活性.

我怎么能在Java 8中实现这一点,我无法弄清楚.

Era*_*ran 9

我假设您希望输出List仅包含所有关联的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());
Run Code Online (Sandbox Code Playgroud)

  • 嗨伊兰,很好的回答,一如既往;)只是关于`equals`方法的用法的注释...每当你想检查一个常量(在这种情况下为"活动")时的相等性,最好检查一下对变量的常量,如"Active".equals(a.getStatus())`.这是为了避免在`a.getStatus()`返回`null`的情况下出现`NullPointerException`. (2认同)