Вы можете использовать Collectors.toMap
с List
из id
, firstName
и lastName
в качестве его ключа и Emp
в качестве его значения с функцией слияния, которая объединит List<EmpRegion>
из Emp
объекты, имеющие одинаковый ключ (id, firstName, lastName)
.И после этого вы можете получить объединенный List<Emp>
, обернув values()
метод Map
in ArrayList<>()
.
public static void main(String[] args) {
Test t = new Test();
// Dummy Values (with two different employees based on `id` = "001" & "002")
List<Emp> employeeList = new ArrayList<>();
employeeList.add(new Emp("001", "ABC", "DEF", t.getEmployeeRegionList("USA")));
employeeList.add(new Emp("001", "ABC", "DEF", t.getEmployeeRegionList("UK")));
employeeList.add(new Emp("001", "ABC", "DEF", t.getEmployeeRegionList("INDIA")));
employeeList.add(new Emp("001", "ABC", "DEF", t.getEmployeeRegionList("CHINA")));
employeeList.add(new Emp("002", "ABC", "DEF", t.getEmployeeRegionList("CHINA", "RUSSIA")));
employeeList.add(new Emp("002", "ABC", "DEF", t.getEmployeeRegionList("USA")));
System.out.println(t.getEmployeesWithMergedEmpRoles(employeeList));
}
private List<Emp> getEmployeesWithMergedEmpRoles(List<Emp> employeeList) {
return new ArrayList<>(employeeList.stream().collect(Collectors.toMap(emp -> Arrays.asList(emp.getId(), emp.getFirstName(), emp.getLastName()),
Function.identity(), (oldValue, newValue) -> {
oldValue.getEmpRegionList().addAll(newValue.getEmpRegionList());
return oldValue;
})).values());
}
private List<EmpRegion> getEmployeeRegionList(String... regions) {
List<EmpRegion> empRegionList = new ArrayList<>();
for (String region : regions) {
empRegionList.add(new EmpRegion("RL-" + region, region));
}
return empRegionList;
}
Вывод:
[
Emp(id="001", firstName="ABC", lastName="DEF",
empRegionList=[
EmpRegion(role="RL-USA", region="USA"),
EmpRegion(role="RL-UK", region="UK"),
EmpRegion(role="RL-INDIA", region="INDIA"),
EmpRegion(role="RL-CHINA", region="CHINA")
]),
Emp(id="002", firstName="ABC", lastName="DEF",
empRegionList=[
EmpRegion(role="RL-CHINA", region="CHINA"),
EmpRegion(role="RL-RUSSIA", region="RUSSIA"),
EmpRegion(role="RL-USA", region="USA")
])
]