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

标签 java collections java-stream

我正在尝试更好地理解如何使用 Java 流。我有这些类(class):

public class Plan {

    List<Request> requestList;
}

public class Request {

    List<Identity> identityList;
    boolean isCancelled;

}

public class Identity {

    String idNumber;
}

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

这是我试过的:

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());
}

这给了我一个错误:

java.util.stream.Stream<com.sandbox.Identity> cannot be converted to boolean

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

如有任何帮助,我们将不胜感激。

最佳答案

假设您希望首先匹配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);
}

或者像这样,使用方法引用,并找到任何匹配的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);
}

关于java - 如何使用 Java 流根据双嵌套列表中的属性过滤集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50052996/

相关文章:

java - 当我点击 map 上 3 个制造商中的 1 个时如何从 Firebase 获取数据

java - 无法将 OnLongClickListener 设置为 ExpandableListView 组

c# - 反序列化集合时未调用 Setter

Java Streams - 缓冲巨大的流

java - 创建对象数组时出现异常

java - 缩进某个字符之后的所有行,直到另一个字符

java - 比较两个大小不等的数组列表 - 比较后堆问题

java - 使用 Java Set 进行重复数据删除

Java 8 流 : conditional Collector

java - 我们可以在 Java 8 中使用流来合并这三个嵌套的 for 循环吗?