Java 8集合 - 在嵌套列表中过滤值

5

我是Java 8和Stream API的新手。

如果我有一个Employee对象列表:

List<Employee> employees;

public class Employee {
    private String name;
    private List<Project> involvedInProjects;
}

public class Project {
    private int projectId;
}

我希望能够使用Java 8的Stream API来筛选参与特定项目的员工,该怎么做呢?

如果我有一个以唯一员工ID为键的Map,而不是一个List,那么这样做会更容易吗?

2个回答

12

因此,您可以在流操作内部访问嵌套列表,然后对其进行操作。在这种情况下,我们可以使用嵌套流作为筛选器的谓词。

employees.stream().filter(
employee -> employee.involvedInProjects.stream()
.anyMatch(proj -> proj.projectId == myTargetId ))

这将为您提供一个流,其中包含至少有一个与目标ID匹配的项目的所有员工。从这里,您可以进一步操作该流或使用 .collect(Collectors.toList()) 将流收集到列表中。

2
如果您不介意就地修改列表,可以使用removeIf,并且作为参数的谓词将检查员工所涉及的项目是否与给定的id(s)不匹配。

例如,
employees.removeIf(e -> e.getInvolvedInProjects().stream().anyMatch(p -> p.getProjectId() == someId));

如果列表不支持删除元素,可以从employees列表中获取流,并使用相反的谓词进行过滤(在这种情况下,您可以使用.noneMatch(p -> p.getProjectId() == someId)),就像在removeIf中一样,并使用Collectors.toList()收集结果。

1
当使用流和过滤器时,需要与 removeIf 相反的谓词。除此之外,最好先获取实际的 Project 实例,然后进行简单的 getInvolvedInProjects().contains(project) 测试(假设 Project 要么是规范的,要么具有适当的 equals 方法,但其他任何内容都将是可疑的设计)... - Holger
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Alexis C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接