Вопрос с собеседования · Java

Чем 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)

Подробно

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.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓map — один в один, flatMap — один в поток и разворачивает их в один, filter — отбирает по условию
  • ✗flatMap сортирует элементы, map преобразует, filter удаляет дубликаты
  • ✗map и flatMap одинаковы, flatMap просто работает параллельно
  • ✗filter преобразует элементы, map отбирает

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования