Как отфильтровать коллекцию на основе свойства в двойном вложенном списке, используя потоки Java - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь лучше понять, как использовать потоки Java. У меня есть эти классы:

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

Я вроде понимаю, почему возникает ошибка. Вложенный фильтр возвращает фильтр, который не может быть оценен как логическое значение. Проблема в том, что я не знаю, чего мне не хватает.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 27 апреля 2018

Если вы хотите, чтобы сначала соответствовало Plan, это можно сделать следующим образом, используя лямбда-выражения:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...