фильтрация значений в списке на основе значений в наборе - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь использовать Java 8, чтобы решить следующую проблему. Скажем, у меня есть следующие (A и B пользовательские классы)

ArrayList<A> skills;
HashSet<B> workCenters;

Что мне нужно сделать, это выяснить, есть ли значение a.getDepartment(), которое является String, также содержащимся в B, который также имеет метод String getDepartment(), а затем собрать их в новый List<A>.

Я пробовал такое:

 List<A> collect = skills.stream()
     .filter(s -> workCenters.contains(s.getDepartment())
     .collect(Collectors.toList());

но в этом случае я делаю это неправильно, потому что не могу получить getDepartment() из workCenters. Какое будет правильное решение?

Ответы [ 4 ]

0 голосов
/ 23 января 2019
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 голосов
/ 23 января 2019

Вы можете начать с преобразования HashSet<B> в HashSet<String>, а затем использовать свой код:

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 голосов
/ 23 января 2019

Первый поток через workCenters и получить набор отделов там, затем поток навыков и отфильтровать любые, не присутствующие в этом наборе.

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

Если вам не нужностарый список больше, вы можете решить удалить элементы из предыдущего списка, а не создавать новый:

skills.removeIf(skill -> !workCenterDepartments.contains(skill.getDepartment()));
0 голосов
/ 23 января 2019
  1. collect весь отдел в workCenters в Set<String> скажем departmentSet.
  2. List<A> collect = skills.stream()
                            .filter(s -> departmentSet.contains(s.getDepartment())
                            .collect(Collectors.toList());
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...