Refactor à double foreach et si statment en solution java 8

Degth:

Eh bien, comme vous pouvez remarquer que j'essaie d'amener les utilisateurs sur un projet spécifique (et mes œuvres de code)

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 cela aurait été simple pour + si je pouvais facilement faire quelque chose comme:

allUsers.stream()
    .filter(u -> u.someCondition)
    .collect(Collectors.toList());

Mais si je dois faire une boucle dans une boucle?

Décision Nguyen Manh:

Vous pouvez le faire:

List<User> usersInSpecificProject =
  allUsers.stream()
        .filter(u -> u.getProjects().stream()
                                    .map(Project::getId)
                                    .anyMatch(pid -> pid.equals(projectId)))
        .collect(Collectors.toList());

Votre version originale devrait être améliorée par breakaprès la condition if(project.getId().equals(projectId))est satisfaite.

Voilà pourquoi l' filterutilisation de anyMatch()briser le premier match.

Pour la version plus élégante, vous pouvez tenir notre filtre:

Predicate<User> hasProject = u -> u.getProjects().stream()
                                   .map(Project::getId)
                                   .anyMatch(pid -> pid.equals(projectId));
List<User> result = allUsers.stream().filter(hasProject).collect(toList());

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=224556&siteId=1
conseillé
Classement