Refactor doble foreach y si DECLARACIÓN en solución java 8

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 breakdespués de la condición if(project.getId().equals(projectId))se cumple.

Es por eso que el filteruso 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());

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=224558&siteId=1
Recomendado
Clasificación