Degth:
Así como se puede notar que intenta llegar a los usuarios en un proyecto específico (y mis trabajos de código)
List<User> allUsers = userRepository.findAll();
List<UserDto> usersInSpecificProject = new ArrayList<>();
for(User user: allUsers){
Set<Project> allProjects = user.getProjects();
for(Project project: allProjects){
if(project.getId().equals(projectId)){
usersInSpecificProject.add(user);
}
}
}
Si hubiera estado solo por + si podría fácilmente hacer algo como:
allUsers.stream()
.filter(u -> u.someCondition)
.collect(Collectors.toList());
Pero lo que si necesito bucle en un bucle?
Decisión Nguyen Manh:
Usted puede hacer esto:
List<User> usersInSpecificProject =
allUsers.stream()
.filter(u -> u.getProjects().stream()
.map(Project::getId)
.anyMatch(pid -> pid.equals(projectId)))
.collect(Collectors.toList());
Su versión original debe mejorarse break
después de la condición if(project.getId().equals(projectId))
se cumple.
Es por eso que el filter
uso de anyMatch()
romper en el primer partido.
Para la versión más elegante, se puede factorizar nuestro filtro:
Predicate<User> hasProject = u -> u.getProjects().stream()
.map(Project::getId)
.anyMatch(pid -> pid.equals(projectId));
List<User> result = allUsers.stream().filter(hasProject).collect(toList());