Java: удалить один объект в списке, который находится в списке - PullRequest
0 голосов
/ 09 марта 2019

Привет! У меня есть список пользователей, у которых может быть несколько вопросов. На каждый вопрос может быть несколько ответов. Я хочу отфильтровать неправильные. Я пробовал код ниже, но фильтр не работает. Я хочу знать, почему

Users.stream().forEach(user ->
            user.getAnswers().stream().forEach(answer ->
                    answer.getReplies().stream().filter(reply ->
                            !reply.getValue().equals("INCORRECT")).collect(Collectors.toList())));

Большое спасибо

1 Ответ

0 голосов
/ 09 марта 2019

Если вы хотите собирать только ответы, попробуйте следующее:

List<Reply> correctReplies = Users.stream()
    .flatMap(user -> user.getAnswers().stream())
    .flatMap(answer -> answer.getReplies().stream())
    .filter(reply -> !reply.getValue().equals("INCORRECT"))
    .collect(Collectors.toList());

Чтобы получить только пользователя с любым правильным ответом:

List<User> usersWithCorrectReplies = Users.stream()
    .filter(user -> user.getAnswers().stream()
            .flatMap(answer -> answer.getReplies().stream())
            .anyMatch(reply -> !reply.getValue().equals("INCORRECT"))
    )
    .collect(Collectors.toList());

Если вы хотите фильтровать только правильные ответы отпользователь, вы должны изменить свой класс, потому что это ответственность этого объекта:

class User {
    List<Answer> getAnswers() { ... }

    List<Reply> correctReplies() {
        return getAnswers().stream()
                .flatMap(answer -> answer.getReplies().stream())
                .filter(reply -> !reply.getValue().equals("INCORRECT"))
                .collect(Collectors.toList());
    }

    boolean hasCorrectReplies() {
        return getAnswers().stream()
                .flatMap(answer -> answer.getReplies().stream())
                .anyMatch(reply -> !reply.getValue().equals("INCORRECT"));
    }
}

Тогда вы можете использовать его:

List<User> usersWithCorrectReplies2 = Users.stream()
    .filter(User::hasCorrectReplies)
    .collect(Collectors.toList());

usersWithCorrectReplies2.forEach(user -> user.correctReplies()
    .forEach(System.out::println));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...