根据set中的值过滤列表中的值

mar*_*ams 3 java java-8

我正在尝试使用java 8来解决以下问题.说我有以下(A并且B是自定义类)

ArrayList<A> skills;
HashSet<B> workCenters;
Run Code Online (Sandbox Code Playgroud)

我需要做的是找出a.getDepartment()一个String也包含B哪个值的方法还有一个方法String getDepartment()然后将它们收集到新的方法中List<A>.

我试过这样的:

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

但在这种情况下,我没有做对,因为我无法getDepartment()从中检索workCenters.什么是正确的解决方案?

Nam*_*man 6

  1. collect所有的部门都workCenters进入了一个Set<String>让我们说departmentSet.
  2. List<A> collect = skills.stream()
                            .filter(s -> departmentSet.contains(s.getDepartment())
                            .collect(Collectors.toList());
    
    Run Code Online (Sandbox Code Playgroud)


ern*_*t_k 6

您可以从转换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());
Run Code Online (Sandbox Code Playgroud)


Mic*_*ael 5

首先流过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());
Run Code Online (Sandbox Code Playgroud)

如果您不再需要旧列表,则可能决定从先前列表中删除元素而不是创建新元素:

skills.removeIf(skill -> !workCenterDepartments.contains(skill.getDepartment()));
Run Code Online (Sandbox Code Playgroud)