Лямбда-слияние внутреннего списка объектов - PullRequest
1 голос
/ 20 сентября 2019

Я пытаюсь объединить empRegionList для Emp, где список Emp, имеющий такие же id, firstName, lastName, затем объединить empRegionList, конечный результат будетУ Emp есть список EmpRegions, я получаю результат, но есть ли лучший способ добиться этого, используя 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)));
    }
}

Ответы [ 3 ]

1 голос
/ 20 сентября 2019

Вы можете использовать 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")
  ])
] 
1 голос
/ 20 сентября 2019
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);
        }
}
0 голосов
/ 20 сентября 2019
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))));
}

Но этот вариант требуется: new ArrayList<>(Arrays.asList(new EmpRegion(...)))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...