J'essaye d'utiliser java 8 pour résoudre le problème suivant. Disons que j'ai ce qui suit ( A
et B
sont des classes personnalisées)
List<A> collect = skills.stream() .filter(s -> workCenters.contains(s.getDepartment()) .collect(Collectors.toList());
Ce que je dois faire est de savoir si value a.getDepartment ()
qui est une String
également contenue dans B
qui a également une méthode String getDepartment ()
puis pour les rassembler dans la nouvelle Liste
.
J'ai essayé une telle:
ArrayList<A> skills; HashSet<B> workCenters;
mais dans ce cas je ne suis pas ' t le faire correctement car je n'ai pas pu récupérer getDepartment ()
à partir de workCenters
. Quelle serait la bonne solution?
4 Réponses :
collectez
tout le département dans workCenters
dans un Set
disons departmentSet
. li >
List<A> collect = skills.stream() .filter(s -> departmentSet.contains(s.getDepartment()) .collect(Collectors.toList());
Vous pouvez commencer par convertir HashSet
en HashSet
, puis utiliser votre code:
Set<String> bDeps = workCenters.stream() .map(B::getDepartment) .collect(Collectors.toSet()); List<A> collect = skills.stream() .filter(s -> bDeps.contains(s.getDepartment())) .collect(Collectors.toList());
Commencez par parcourir les workCenters
et récupérez l'ensemble des départements, puis diffusez les compétences et filtrez celles qui ne sont pas présentes dans cet ensemble.
skills.removeIf(skill -> !workCenterDepartments.contains(skill.getDepartment()));
Si vous n'avez plus besoin de l'ancienne liste, vous pouvez décider de supprimer des éléments de la liste précédente plutôt que d'en créer une nouvelle:
final Set<String> workCenterDepartments = workCenters.stream() .map(B::getDepartment) .collect(Collectors.toSet()); final List<A> skillsWithWorkCenterDept = skills.stream() .filter(skill -> workCenterDepartments.contains(skill.getDepartment())) .collect(Collectors.toList());
List<B> workCenters = Collections.emptyList(); List<A> skills = Collections.emptyList(); Set<String> workCenterDepartments = workCenters.stream().map(B::getDepartment).collect(Collectors.toSet()); List<A> skillsWithWorkCenterDept = new ArrayList<>(skills); skillsWithWorkCenterDept.removeIf(skill -> !workCenterDepartments.contains(skill.getDepartment()));
vous montrez un peu de code pour que nous essayions de comprendre celui-ci