使用 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());
哎呀,我几乎需要一点帮助来解决这个问题!新来的 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());