У каждого студента есть список секций, которые он посещает.
У метода groupingBy есть свой аккумулятор через метод Collector.of. так как метод groupingBy собирает группы с типом входной коллекции. В нашем случае там нужны только имена студентов.
Как работет Collector.of в методе, который группирует студентов по секциям?
public static Map> sections(List students) {
return students.stream().flatMap(student -> student.getUnits().stream().map(unit -> new Holder(unit, student.getName()))) // собираем объект Holder с unit и name
.collect( // собираем карту
Collectors.groupingBy(t -> t.key, // определяем группировку
Collector.of(
HashSet::new, // аккумулятор.
(set, el) -> set.add(el.value),// как добавлять данные.
(left, right) -> { // для агрегации.
left.addAll(right);
return left;
}
)
)
);
}