Collectors.flatMapping()
Использование flatMapping() для сглаживания внутри группирующего Collector.
Сравнение кода
✕ Java 8
// Flatten within a grouping collector
// Required complex custom collector
Map<String, Set<String>> tagsByDept =
// no clean way in Java 8
✓ Java 9+
var tagsByDept = employees.stream()
.collect(groupingBy(
Emp::dept,
flatMapping(
e -> e.tags().stream(),
toSet()
)
));
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Компонуемый
Работает как нижестоящий Collector внутри groupingBy.
Один проход
Сглаживание и группировка за один проход Stream.
Вкладываемый
Сочетается с другими нижестоящими Collectors.
Старый подход
Вложенный flatMap
Современный подход
flatMapping()
Начиная с JDK
9
Сложность
Средний
Поддержка JDK
Collectors.flatMapping()
Доступно
Широко доступно с JDK 9 (сент. 2017)
Как это работает
Collectors.flatMapping() применяет отображение «один ко многим» в качестве нижестоящего Collector. Это эквивалент Collector для Stream.flatMap() — полезен внутри groupingBy или partitioningBy.
Связанная документация
Доказательство