我是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中的流API进行此操作?
如果我的地图中的密钥是唯一的employeeID而不是List,会不会更容易?
答案 0 :(得分:3)
因此,您可以访问流操作中的嵌套列表,然后使用它。在这种情况下,我们可以使用嵌套流作为过滤器的谓词
employees.stream().filter(
employee -> employee.involvedInProjects.stream()
.anyMatch(proj -> proj.projectId == myTargetId ))
这将为您提供至少一个与您的targetId匹配的项目的所有员工的流。在此处,您可以在流上进一步操作或将流收集到包含.collect(Collectors.toList())
答案 1 :(得分:2)
如果您不介意修改列表,可以使用removeIf
,并且您将作为参数提供的谓词将检查涉及员工的项目是否与给定ID不匹配(或多个)。
例如,
employees.removeIf(e -> e.getInvolvedInProjects().stream().anyMatch(p -> p.getProjectId() == someId));
如果列表不支持删除元素,请从employees
列表中获取流,并使用相反的谓词(在这种情况下,您可以使用.noneMatch(p -> p.getProjectId() == someId)
)对其进行过滤,如同{{1使用removeIf
收集结果。