使用 Streams,查看一个列表是否包含另一个列表中对象的属性

问题描述 投票:0回答:2

这里是 Java 新学生。 我有一份如下所示的员工名单:

public class Employee {
    private String name;
    private String department;
}

以及如下所示的公司列表:

public class Company {  
    private String name;    
    List<Department> departments;
}

部门只是:

public class Department{    
    private String name;
    private Integer totalSalary;
}

我的任务是传输为给定公司工作的员工列表,这是传递给我的函数的唯一参数。

当我第一次阅读它时,这似乎很容易,但由于课程的设置方式,(公司只有一个部门列表,员工只有一个部门,但员工和公司之间没有联系)我可以流式传输公司中所有部门的列表,但只是不知道如何将其返回并将员工的部门字符串与属于相关公司的部门中的任何字符串进行匹配。

List<Department> deptsInCompany = companies.stream()
                .filter(s -> s.getName().equals(passedInCompany))
                .flatMap(s -> s.getDepartments().stream())              
                .collect(Collectors.toList());

我只是不确定如何使用该部门列表来回溯并找到这些部门中的员工。我想我的菜鸟头脑无法摆脱希望每个部门对象中有一个员工列表的想法,但没有!

java list collections java-stream
2个回答
3
投票

将具有给定名称的(单个)公司的部门名称收集到

Set
中(这比列表查找速度更快)。

Set<String> departmentNames = companies.stream()
    .filter(c -> c.getName().equals(companyName))
    .findFirst().get().getDepartments().stream()
    .map(Department::getName)
    .collect(Collectors.toSet());

然后从列表中删除所有不属于这些部门的员工。

employees.removeIf(e -> !departmentNames.contains(e.getDepartment()));

如果您想保留员工列表,过滤并收集:

List<Employee> employeesInCompany = employees.stream()
    .filter(e -> departmentNames.contains(e.getDepartment()))
    .collect(Collectors.toList());

1
投票

假设您有所有员工的列表,并且所有模型类都有其属性的 getter,您可以执行以下操作:

public static void main(String[] args) {
    List<Company> companies = // Your list of Companies
    String passedInCompany = "Company";
    
    List<String> deptsNameInCompany = companies.stream()
            .filter(s -> s.getName().equals(passedInCompany))
            .flatMap(s -> s.getDepartments().stream())
            .map(Department::getName)
            .collect(Collectors.toList());

    List<Employee> employees = // All Employees
    List<Employee> employeesInCompanyDepts = employees.stream()
            .filter(employee -> deptsNameInCompany.contains(employee.getDepartment()))
            .collect(Collectors.toList());
}

基本上,您需要收集所有

Department
的名称,然后找到在其
Employee
属性中具有此类
Department
名称的
department

© www.soinside.com 2019 - 2024. All rights reserved.