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

sja*_*der 5 java-8 java-stream

我是 Java 8 和 Stream API 的新手。

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

List<Employee> employees;

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

public class Project {
    private int projectId;
}
Run Code Online (Sandbox Code Playgroud)

我想过滤参与某些项目的员工,我将如何使用 java 8 中的流 API 执行此操作?

如果我有一个 Map ,其中键是唯一的员工 ID 而不是 List 会更容易吗?

Gen*_*lor 8

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

employees.stream().filter(
employee -> employee.involvedInProjects.stream()
.anyMatch(proj -> proj.projectId == myTargetId ))
Run Code Online (Sandbox Code Playgroud)

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


Ale*_* C. 2

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

例如,

employees.removeIf(e -> e.getInvolvedInProjects().stream().anyMatch(p -> p.getProjectId() == someId));
Run Code Online (Sandbox Code Playgroud)

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