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