Java 8 Java 8集合-对嵌套列表中的值进行筛选

Java 8 Java 8集合-对嵌套列表中的值进行筛选,java-8,java-stream,Java 8,Java Stream,我不熟悉Java8和流API 如果我有员工对象列表: List<Employee> employees; public class Employee { private String name; private List<Project> involvedInProjects; } public class Project { private int projectId; } 列出员工名单; 公营雇员{ 私有字符串名称; 涉及项目的私人清单;

我不熟悉Java8和流API

如果我有员工对象列表:

List<Employee> employees;

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

public class Project {
    private int projectId;
}
列出员工名单;
公营雇员{
私有字符串名称;
涉及项目的私人清单;
}
公共类项目{
私有int投影;
}
我想对参与某些项目的员工进行筛选,我将如何使用Java8中的流API进行筛选


如果我有一个映射,其中键是唯一的employeeID,而不是列表,会更容易吗?

如果您不介意修改列表,可以使用
removeIf
,您将作为参数提供的谓词将检查员工参与的项目是否与给定id不匹配

比如说,

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

如果列表不支持删除元素,请从
employees
列表中获取流,并使用相反的谓词对其进行过滤(在本例中,您可以使用
中的
.noneMatch(p->p.getProjectId()==someId)
),如
removeIf
中所述,并使用
收集器收集结果。toList()

这样您就可以访问流操作中的嵌套列表,然后使用它。在这种情况下,我们可以使用嵌套流作为过滤器的谓词

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

这将为您提供至少有一个项目与您的targetId匹配的所有员工流。从这里,您可以对流进行进一步操作,或者使用
.collect(collector.toList())

将流收集到一个列表中。使用流和过滤器时,需要与
removeIf
相反的谓词。除此之外,最好先获得实际的
项目
实例,然后执行一个简单的
getInvolvedInProjects().contains(Project)
测试(假设
Project
s是规范的,或者有一个合适的
equals
方法,但其他一切都是有问题的设计)@Holger谢谢,不知道我今天怎么了!完全同意你的最后一点。。。