为了账号安全,请及时绑定邮箱和手机立即绑定

根据集合中的值过滤列表中的值

根据集合中的值过滤列表中的值

绝地无双 2022-05-21 14:01:25
我正在尝试使用 java 8 来解决以下问题。说我有以下(A并且B是自定义类)ArrayList<A> skills;HashSet<B> workCenters;我需要做的是查找 value a.getDepartment()which is a Stringalso包含在B其中是否也有一个方法String getDepartment(),然后将它们收集到 newList<A>中。我试过这样: List<A> collect = skills.stream()     .filter(s -> workCenters.contains(s.getDepartment())     .collect(Collectors.toList());但在这种情况下,我做得不对,因为我无法getDepartment()从workCenters. 什么是正确的解决方案?
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您可以先转换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());


查看完整回答
反对 回复 2022-05-21
?
慕斯王

TA贡献1864条经验 获得超2个赞

  1. collect比方说,所有部门都workCenters进入了。Set<String>departmentSet

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


查看完整回答
反对 回复 2022-05-21
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

首先流式传输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()));


查看完整回答
反对 回复 2022-05-21
  • 3 回答
  • 0 关注
  • 87 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信