3
votes

filtrage des valeurs dans la liste en fonction des valeurs de l'ensemble

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?


1 commentaires

vous montrez un peu de code pour que nous essayions de comprendre celui-ci


4 Réponses :


6
votes
  1. collectez tout le département dans workCenters dans un Set disons departmentSet . li >
  2. List<A> collect = skills.stream()
                            .filter(s -> departmentSet.contains(s.getDepartment())
                            .collect(Collectors.toList());
    

0 commentaires

6
votes

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());


0 commentaires

5
votes

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());


0 commentaires

1
votes
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()));

0 commentaires