Java 8集合 - 过滤嵌套列表

时间:2015-11-19 18:58:11

标签: 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;
}

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

如果我的地图中的密钥是唯一的employeeID而不是List,会不会更容易?

2 个答案:

答案 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收集结果。