如何使用 Java 流根据双嵌套列表中的属性过滤集合

See*_*hor 5 java collections java-stream

我正在尝试更好地理解如何使用 Java 流。我有这些课程:

public class Plan {

    List<Request> requestList;
}

public class Request {

    List<Identity> identityList;
    boolean isCancelled;

}

public class Identity {

    String idNumber;
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个方法,该方法返回包含具有匹配标识号的未取消请求的计划。

这是我尝试过的:

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());
}
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

java.util.stream.Stream<com.sandbox.Identity> cannot be converted to boolean
Run Code Online (Sandbox Code Playgroud)

我有点理解为什么会出现错误。嵌套过滤器返回一个不能被评估为布尔值的过滤器。问题是,我不知道我错过了什么。

任何帮助,将不胜感激。

And*_*eas 6

假设你想匹配Plan,它可以像这样使用 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);
}
Run Code Online (Sandbox Code Playgroud)

或者像这样,使用方法引用,并找到任何匹配Plan

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);
}
Run Code Online (Sandbox Code Playgroud)