Группировка по списку объектов по нескольким полям Java 8 - PullRequest
0 голосов
/ 08 апреля 2020

У меня будет список Employee, который будет содержать 3 атрибута - DepartmentId, employeeId, employeeGroup.

Я хочу выполнить группировку по идентификатору отдела и идентификатору сотрудника. Идея состоит в том, чтобы отправить групповое имя сотрудника с принадлежащим отделом. Ниже приведены 3 возможных случая:

Дело № 1: тот же отдел, другой сотрудник, другая группа.

["Dept001", 100, "Admin"]
["Dept001", 101, "Contrator"]

Дело № 2: то же отдел, тот же сотрудник, другая группа

["Dept001", 100, "Admin"]
["Dept001", 100, "Contrator"]

Дело № 3: Различный отдел, сотрудник отдела, та же группа.

["Dept001", 100, "Admin"]
["Dept002", 101, "Admin"]

Я пытался ниже:

Map<String, Set<Employee>> map = new TreeMap<>();

map = myList.stream().collect(Collectors.groupingBy(Employee::getDepartmentId, 
Collectors.toSet()));

Ответы [ 2 ]

3 голосов
/ 08 апреля 2020

Группировка по нескольким полям потребует нескольких вызовов на Collectors#groupingBy. К счастью, второй параметр перегруженного метода Collectors#groupingBy - это еще один Collector, поэтому его можно просто вызвать дважды.

Map<String, Map<Integer, Set<Employee>>> map = myList.stream()
    .collect(Collectors.groupingBy(Employee::getDepartmentId, 
        Collectors.groupingBy(Employee::getEmployeeId, Collectors.toSet())));

Обратите внимание, что значение Map является другим Map; первый из них связан с идентификатором отдела сотрудников, а второй - с идентификатором сотрудника.

0 голосов
/ 08 апреля 2020

Как я понимаю, вы просто хотите сделать groupBy с EmployeeId и DepartmentId, чтобы впоследствии вы могли однозначно идентифицировать сотрудника с этим объединенным свойством.

Вы можете использовать stream в сочетании с Tuple, код будет выглядеть так:

Map<Tuple, List<Emplyee>> map = employees.stream() .collect(groupingBy(employee-> new Tuple(employee.getEmployeeId(), employee.getDepartmentId())));

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