Reputation: 3881
I am trying to merge empRegionList
for an Emp
, where a list of Emp
having same id
,firstName
, lastName
then merge the empRegionList
, the final result would be a Emp
have list of EmpRegions
, I am getting the result but is there any better way to achieve this using Lambdas.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class Emp{
private String id;
private String firstName;
private String lastName;
private List<EmpRegion> empRegionList;
public Emp(String id, String firstName, String lastName, List<EmpRegion> empRegionList) {
this.id = id;
this.firstName = firstName;
this.lastName = lastName;
this.empRegionList = empRegionList;
}
//get-set-equal-hashcode-toString methods
}
class EmpRegion{
private String role;
private String region;
public EmpRegion(String role, String region) {
this.role = role;
this.region = region;
}
//get-set-equal-hashcode-toString methods
}
public class Test {
public static void main(String[] args) {
List<String> regions = Arrays.asList("USA", "UK", "INDIA","CHINA");
Test t=new Test();
Emp emp= t.getEmpWithMergedEmpRole("001",regions);
System.out.println(emp);
}
private Emp getEmpWithMergedEmpRole(String id, List<String> regions){
List<Emp> empList=new ArrayList<>();
for(String region: regions){
empList.add(getEmp(id,region));
}
List<EmpRegion> empRegionList= empList.stream().map(e -> e.getEmpRegionList()).flatMap(List::stream).collect(Collectors.toList());
empList.get(0).setEmpRegionList(empRegionList);
return empList.get(0);
}
private Emp getEmp(String id, String region) {
return new Emp(id,"Abc","Def", Arrays.asList(new EmpRegion("RL-"+region, region)));
}
}
Upvotes: 1
Views: 137
Reputation: 3866
You can use Collectors.toMap
with a List
of id
, firstName
and lastName
as its key and Emp
as its value with a merge function that will combine the List<EmpRegion>
of Emp
objects that have same key (id, firstName, lastName)
. And after that, you can get the merged List<Emp>
by wrapping values()
method of the 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;
}
Output:
[
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")
])
]
Upvotes: 1
Reputation: 3572
private Emp getEmpWithMergedEmpRole(String id, List<String> regions) {
List<Emp> empList = new ArrayList<>();
for (String region : regions) {
empList.add(getEmp(id, region));
}
Emp emp = empList.get(0);
empList.stream()
.map(Emp::getEmpRegionList)
.forEach(emp.getEmpRegionList()::addAll);
return emp;
}
private Emp getEmp(String id, String region) {
return new Emp(id, "Abc", "Def", new ArrayList<>(Arrays.asList(new EmpRegion("RL-" + region, region))));
}
But this variant required: new ArrayList<>(Arrays.asList(new EmpRegion(...)))
Upvotes: 0
Reputation: 60
public class Test{
public static void main(String[] args) {
List<String> regions = Arrays.asList("USA", "UK", "INDIA","CHINA");
Test t=new Test();
Emp emp= t.getEmpWithMergedEmpRole("001",regions);
System.out.println(emp);
}
private Emp getEmpWithMergedEmpRole(String id, List<String> regions){
List<EmpRegion> empRegionList = regions.stream().map(region -> new EmpRegion("RL-"+region, region)).collect(Collectors.toList());
return new Emp(id,"Abc","Def", empRegionList);
}
}
Upvotes: 1