Stream.mapMulti()
Вывод нуля или более элементов на входной элемент без создания промежуточных Stream.
Сравнение кода
✕ Java 8
stream.flatMap(order ->
order.items().stream()
.map(item -> new OrderItem(
order.id(), item)
)
);
✓ Java 16+
stream.<OrderItem>mapMulti(
(order, downstream) -> {
for (var item : order.items())
downstream.accept(
new OrderItem(order.id(), item));
}
);
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Меньше аллокаций
Не создаётся промежуточный Stream для каждого элемента.
Императивный стиль
Использование циклов и условий напрямую.
Гибкий
Вывод нуля, одного или нескольких элементов с полным контролем.
Старый подход
flatMap + List
Современный подход
mapMulti()
Начиная с JDK
16
Сложность
Средний
Поддержка JDK
Stream.mapMulti()
Доступно
Широко доступно с JDK 16 (март 2021)
Как это работает
mapMulti() — императивная альтернатива flatMap, которая избегает создания промежуточных объектов Stream для каждого элемента. Эффективнее, когда отображение порождает небольшое количество элементов.
Связанная документация
Доказательство