Reputation: 1593
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?
Upvotes: 1
Views: 322
Reputation: 393771
Use Collectors.groupingBy
:
Map<Integer, List<EmployeeJob>> map =
list.stream()
.collect(Collectors.groupingBy(ej -> ej.getEmployee().getEmployeeId()));
Upvotes: 2
Reputation: 3232
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
}
Upvotes: 0
Reputation: 11958
groupingBy()
does exactly this:
Map<Integer, List<EmployeeJob>> map = jobs.stream().collect(groupingBy(job -> job.getEmployee().getEmployeeId()));
Unfortunately, you cannot use a method reference since you have to go through the Employee
class.
Upvotes: 0