Встречается на собеседованиях • сегодня

В чем разница между операциями map и flatMap в Stream API

Разница между map и flatMap в Stream API

Устный ответ

Если коротко

  • map делает преобразование один к одному: на каждый входной элемент — ровно один выходной.
  • flatMap сначала превращает элемент в набор или поток, затем «расплющивает» их в один общий поток — то есть на один вход может дать от нуля до нескольких выходов.

Чуть подробнее

  • Применяю map, когда каждому элементу нужна одна новая форма, например строку в длину.
  • flatMap беру, когда из элемента получается коллекция или поток и их нужно слить в один поток. Например: список предложений разбиваем на слова: «берём поток строк → для каждой строки получаем поток слов → расплющиваем → собираем».
  • Важно: flatMap может вернуть пустой поток и тем самым «выбросить» элемент; порядок исходного потока сохраняется по контракту.

Идеально

  • По производительности map дешевле: одна функция — один элемент, меньше аллокаций.
  • flatMap часто создаёт множество временных коллекций или потоков; на больших объёмах это бьёт по GC.
  • С Java шестнадцать есть mapMulti — даёт те же эффекты, что flatMap, но без создания промежуточных потоков, удобно для высокой производительности.
  • Для примитивов лучше flatMapToInt и похожие, чтобы избегать автобоксинга.
  • Краевые случаи: функция в flatMap не должна возвращать null-поток — будет исключение; при работе с ресурсами внутри flatMap (например, строки файла) важно корректно закрывать их.
  • Альтернативы: Collectors.flatMapping в комбинированных коллекторах и mapMulti для «расплющивания» в один проход; в параллельных потоках flatMap может давать неровную нагрузку — иногда лучше предварительно собрать и затем обрабатывать пакетами.

Тезисно

Если коротко

  • map: преобразование 1→1 (на каждый входной элемент — ровно один выходной).
  • flatMap: преобразование 1→0..n (элемент превращается в набор/поток и «расплющивается» в общий поток).

Чуть подробнее

  • map — когда каждому элементу нужна одна новая форма.
  • flatMap — когда из элемента получается коллекция или поток и их нужно слить в один общий поток.
  • flatMap может вернуть пустой поток и «выбросить» элемент.

Идеально

  • map дешевле по производительности: одна функция — один элемент, меньше аллокаций.
  • flatMap дороже: часто создаёт временные коллекции/потоки, что бьёт по GC.
  • Начиная с Java 16, mapMulti даёт эффекты flatMap, но без создания промежуточных потоков.
  • В flatMap функция не должна возвращать null-поток — будет исключение.
  • В параллельных потоках flatMap может давать неровную нагрузку.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы