如何使用Java streams根据双嵌套列表中的属性筛选集合

如何使用Java streams根据双嵌套列表中的属性筛选集合,java,collections,java-stream,Java,Collections,Java Stream,我正在努力更好地理解如何使用Java流。我有以下课程: public class Plan { List<Request> requestList; } public class Request { List<Identity> identityList; boolean isCancelled; } public class Identity { String idNumber; } 公共课程计划{ 列表请求列表; } 公共

我正在努力更好地理解如何使用Java流。我有以下课程:

public class Plan {

    List<Request> requestList;
}

public class Request {

    List<Identity> identityList;
    boolean isCancelled;

}

public class Identity {

    String idNumber;
}
公共课程计划{
列表请求列表;
}
公共类请求{
列表标识符列表;
布尔值被取消;
}
公共阶级身份{
字符串ID号;
}
我正在尝试编写一个方法,该方法返回包含具有匹配标识号的未取消请求的计划

这就是我尝试过的:

public static Plan findMatchingPlan(List<Plan> plans, String id) {
    List<Plan> filteredPlan = plans.stream()
            .filter(plan -> plan.getRequestList().stream()
                    .filter(request -> !request.isCancelled())
                    .filter(request -> request.getIdentityList().stream()
                        .filter(identity -> identity.getIdNumber().equals(id))))
            .collect(Collectors.toList());
}
公共静态计划findMatchingPlan(列表计划,字符串id){
List filteredPlan=plans.stream()
.filter(计划->计划.getRequestList().stream())
.filter(请求->!请求.isCancelled())
.filter(请求->请求.getIdentityList().stream())
.filter(标识->标识.getIdNumber().equals(id)))
.collect(Collectors.toList());
}
这给了我一个错误:

java.util.stream.Stream<com.sandbox.Identity> cannot be converted to boolean
java.util.stream.stream无法转换为布尔值
我有点理解为什么会有错误。嵌套筛选器返回一个不能作为布尔值计算的筛选器。问题是,我不知道我错过了什么

任何帮助都将不胜感激

假设您希望首先匹配
计划
,可以使用lambda表达式如下所示:

public static Plan findMatchingPlan(List<Plan> plans, String id) {
    return plans.stream()
                .filter(plan -> plan.getRequestList()
                                    .stream()
                                    .filter(request -> ! request.isCancelled())
                                    .flatMap(request -> request.getIdentityList().stream())
                                    .anyMatch(identity -> identity.getIdNumber().equals(id)))
                .findFirst()
                .orElse(null);
}

下定决心吧。您想要
计划
(返回类型)(或
列表
*(局部变量)。如果只是一个
计划
,您想要第一个、任何一个或最后一个匹配吗?@Andreas计划的第一个匹配是理想的。我为没有清理这一点表示歉意。啊,谢谢。我的问题是,我只是在筛选时没有指定如何处理过滤流?如果方法返回可选,以避免将空值处理为w,那就太好了正如改进代码文档一样。@Seephor不,您的问题是
filter()
不是一个。在我的解决方案中,
anyMatch
findAny
都是终端操作。
public static Plan findMatchingPlan(List<Plan> plans, String id) {
    return plans.stream()
                .filter(plan -> plan.getRequestList()
                                    .stream()
                                    .filter(request -> ! request.isCancelled())
                                    .map(Request::getIdentityList)
                                    .flatMap(List::stream)
                                    .map(Identity::getIdNumber)
                                    .anyMatch(id::equals))
                .findAny()
                .orElse(null);
}