我正在尝试使用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.什么是正确的解决方案?
collect所有的部门都workCenters进入了一个Set<String>让我们说departmentSet.List<A> collect = skills.stream()
.filter(s -> departmentSet.contains(s.getDepartment())
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)您可以从转换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)
首先流过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)
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |