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

标签 java list collections stream

天啊,我几乎还需要一点帮助来表达这个问题!新的 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;
}

因此,我的任务是传输为同一家公司工作的员工列表。 (抱歉之前没有说:公司被传递到一个函数中。这是唯一的论点)当我第一次读到它时,这似乎很容易,但是由于类的设置方式,(只有部门列表的公司,并且员工只有一个部门,但员工和公司之间没有联系)我可以流式传输以制作公司所有部门的列表,但只是不知道如何将其带回并将员工的部门字符串与来自属于该公司的部门...

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

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

任何一点小小的插入将不胜感激!我保证当我有一定的技能时我会把它转发出去!!

最佳答案

将具有给定名称的(单个)公司的部门名称收集到集合中(这比列表查找速度更快)。

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());

关于java - 使用 Streams 查看一个列表是否包含另一个列表中的对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70356739/

相关文章:

android - Gradle,定义一个属性集合

java - freemarker 宏参数内的 if-else 语句?

java - JAX-RS 的双向字段值转换

java - 如何在android keystore 中存储私钥?

python - 获取列表中给定项目的计数(不使用 numpy)

Java 并发 - 队列效率高于列表

java - 从文本文件中的字符串创建网格

java - 检查一个字符串是否匹配除另一个字符串之外的所有字符

list - Haskell 列表 Monad 状态依赖

java - 如何按属性查找集合中的元素?