Java 8 потоков: сопоставление и добавление параметров из одного списка в другой - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в потоках и лямбде. Ищу более аккуратный код для этого варианта использования.

У меня есть два списка типов объектов

class Employee{
   long empId;
   String empName;
   String deptName
}

и

class Department{
   long deptId;
   String deptName;
   long empId;
}

Первоначально список сотрудников заполняется только empId и empName. И список отделов заполнен всеми полями deptId, deptName, empId.

Я должен заполнить соответствующий deptName в списке сотрудников из списка отделов.

Это что я сделал.

  1. Сделал карту empID и deptName из DepartmentList
  2. Итерировать и сопоставить с картой
Map<Long,String> departmentMap = departmentList.stream()
                .collect((Collectors.toMap(Department::getEmpId, Department::getDeptName)));
employeeList.forEach(emp -> {
if(departmentMap.containsKey(emp.getEmpId())){
        emp.setDeptName(departmentMap.get(emp.getEmpId()));
}
});

Есть ли более чистый или аккуратный способ справиться с этим в Java 8/10?

1 Ответ

1 голос
/ 23 июля 2020

Если я правильно понял, вы ищете что-то вроде:

List<Employee> employeeList = List.of(new Employee(1, "John"), new Employee(2, "Emily"));
List<Department> departmentList = List.of(new Department(1, "Dept 1", 1), new Department(2, "Dept 2", 2));

Map<Long, Department> departmentMap = departmentList.stream()
                .collect(toMap(department -> department.empId, department -> department));

employeeList.forEach(e -> e.deptName = departmentMap.get(e.empId).deptName);

Вы можете использовать Collectors.toMap () , чтобы превратить ваш List в Map, а затем просто go вместо employeeList и назначьте каждому сотруднику свой отдел.

...