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 break
après la condition if(project.getId().equals(projectId))
est satisfaite.
Voilà pourquoi l' filter
utilisation 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());