Вы можете сделать это:
List<User> usersInSpecificProject =
allUsers.stream()
.filter(u -> u.getProjects().stream()
.map(Project::getId)
.anyMatch(pid -> pid.equals(projectId)))
.collect(Collectors.toList());
Ваша исходная версия должна быть улучшена с помощью break
после выполнения условия if(project.getId().equals(projectId))
.
Именно поэтому filter
использует anyMatch()
, чтобы разбить первое совпадение.
Для более элегантной версии вы можете указать наш фильтр:
Predicate<User> hasProject = u -> u.getProjects().stream()
.map(Project::getId)
.anyMatch(pid -> pid.equals(projectId));
List<User> result = allUsers.stream().filter(hasProject).collect(toList());