Ответ
Основная форма Collectors.groupingBy принимает Function<T, K> — функциональный интерфейс, который преобразует элемент потока в ключ для группировки.
Пример:
Map<Department, List<Employee>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
Перегруженные версии:
groupingBy(Function<T,K> classifier, Collector<A,T,D> downstream)— для последующей агрегации сгруппированных элементов.groupingBy(Function<T,K> classifier, Supplier<Map> mapFactory, Collector<A,T,D> downstream)— для указания конкретной реализацииMap.
Почему Function? — Потому что для каждого элемента нужно вычислить ключ группировки, что является чистой функцией преобразования.