Если вы хотите собирать только ответы, попробуйте следующее:
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));