Какой функциональный интерфейс принимает метод Collectors.groupingBy в качестве классификатора?

«Какой функциональный интерфейс принимает метод Collectors.groupingBy в качестве классификатора?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основная форма 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? — Потому что для каждого элемента нужно вычислить ключ группировки, что является чистой функцией преобразования.