Списки групп Java 8 для сопоставления - PullRequest
0 голосов
/ 25 октября 2018

У меня есть класс Employee и EmployeeJob со следующими сигнатурами:

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;
    }
}

Я хочу Map<Integer, List<EmployeeJob>> из List<EmployeeJob>, где ключом будет employeeId из Сотрудник класс.Как я могу использовать потоки Java 8, чтобы сгруппировать этот список по его employee-> employeeId ?.

Возможно решить в одном потоке, или я должен разделить его или пойтидля классического решения?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

groupingBy() делает именно это:

Map<Integer, List<EmployeeJob>> map = jobs.stream().collect(groupingBy(job -> job.getEmployee().getEmployeeId()));

К сожалению, вы не можете использовать ссылку на метод, поскольку вам нужно пройти через класс Employee.

0 голосов
/ 25 октября 2018
public static void main(String[] args) {

List<EmployeeJob> listEmployees= new ArrayList<>();
System.out.println(listEmployees);//previous list

Map<Integer, List<EmployeeJob>> newMap =
    listEmployees.stream()
        .collect(Collectors.groupingBy(employee->employee.getEmployee().getEmployeeId()));
System.out.println(newMap); // new expected map
}
0 голосов
/ 25 октября 2018

Использование Collectors.groupingBy:

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