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

Using Streams, see if a list contains a property of an object from another list

哎呀,我几乎需要一点帮助来解决这个问题!新来的 Java II 学生,提前感谢您的宝贵时间。

我有一份如下所示的员工名单:

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;
}

所以我的任务是流式传输为同一家公司工作的员工列表。 (很抱歉之前没有说:公司被传递给一个功能。这是唯一的论点)当我第一次阅读它时似乎很容易,但是由于 类 的设置方式,(公司只有一个列表部门,员工只有一个部门,但员工和公司之间没有 link)员工的部门字符串以及属于相关公司部门的任何字符串...

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

我只是不确定如何使用该部门列表回溯并找到这些部门中的员工。我想我的 ROOKIE 脑子里一直想在每个部门对象中都有一个员工列表,但是没有!

如有任何建议,我们将不胜感激!等我有本事以后一定会还的!!

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

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 的名字,然后在其 department 属性 中找到具有这样 Department 名字的 Employee .

将具有给定名称的(单个)公司的部门名称收集到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());