Получить доступ

Чем map, flatMap и filter отличаются в Stream API?

MiddleЛямбды и Stream API
Коротко

map — один элемент → один элемент (преобразование). flatMap — один элемент → поток элементов, все потоки разворачиваются в один. filter — оставляет элементы, удовлетворяющие условию.

  • map(User::email): Stream<User> → Stream<String>
  • flatMap(u -> u.roles().stream()): Stream<User> → Stream<Role>
  • Java 16: mapMulti — альтернатива flatMap без создания промежуточных стримов

А ещё Та же пара map/flatMap есть у Optional и CompletableFuture (thenApply/thenCompose)

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

List<String> emails = users.stream()
    .filter(User::isActive)               // Stream<User>, только активные
    .map(User::email)                     // Stream<String>
    .toList();

Set<Role> roles = users.stream()
    .flatMap(u -> u.roles().stream())     // Stream<Role> из всех списков
    .collect(Collectors.toSet());

Если в втором примере взять map, получится Stream<Stream<Role>> — поток потоков, с которым неудобно работать.

Частые применения flatMap: развернуть вложенные коллекции, разбить строки на слова (lines.flatMap(l -> Arrays.stream(l.split(" ")))), отбросить пустые Optional (.flatMap(Optional::stream)).

Порядок: filter стоит ставить раньше дорогого map — элементы проходят конвейер по одному, и отброшенные не будут преобразованы зря.

Что хотят услышать

  • Различие трёх операций с типами.
  • Пример flatMap для вложенных коллекций.

Частые ошибки

  • Получить Stream<Stream<T>> там, где нужен flatMap.
  • Делать побочные эффекты внутри map/filter.

Что спросят дальше

  • Почему stream операции ленивые?
  • Чем collect отличается от reduce?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем