Search code examples
javajava-8java-stream

Java 8 group lists to map


I have a Employee and a EmployeeJob class with the following signatures:

public class Employee {

    public Integer employeeId;

    public Integer getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(Integer employeeId) {
        this.employeeId = employeeId;
    }
}

public class EmployeeJob {

    private Integer employeeJobId;
    private Employee employee;
    private String jobName;
    public Integer getEmployeeJobId() {
        return employeeJobId;
    }
    public void setEmployeeJobId(Integer employeeJobId) {
        this.employeeJobId = employeeJobId;
    }
    public Employee getEmployee() {
        return employee;
    }
    public void setEmployee(Employee employee) {
        this.employee = employee;
    }
    public String getJobName() {
        return jobName;
    }
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
}

I want a Map<Integer, List<EmployeeJob>> from a List<EmployeeJob> where the key would be the employeeId from the Employee class. How can I can I use java 8 streams to group that list by its employee->employeeId?.

It is possible to solve in a single stream or should I split it somehow or go for the classical solution?


Solution

  • Use Collectors.groupingBy:

    Map<Integer, List<EmployeeJob>> map =
        list.stream()
            .collect(Collectors.groupingBy(ej -> ej.getEmployee().getEmployeeId()));