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

Чем промежуточные операции Stream отличаются от терминальных?

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

Промежуточные операции (filter, map, sorted) ленивы и возвращают новый Stream — они только описывают конвейер. Терминальная (collect, forEach, count, findFirst) запускает обработку и возвращает результат или побочный эффект. Без терминальной ничего не выполнится.

  • Стрим одноразовый: после терминальной — IllegalStateException
  • Элементы идут по конвейеру по одному, а не этапами
  • Короткое замыкание: findFirst, anyMatch, limit останавливают обработку рано

А ещё sorted и distinct — промежуточные с состоянием: им нужно увидеть все элементы

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

Подробно

Конвейер = источник + цепочка промежуточных операций + одна терминальная.

List<String> names = users.stream()     // источник
    .filter(User::isActive)             // промежуточная
    .map(User::name)                    // промежуточная
    .limit(10)                          // промежуточная, короткое замыкание
    .toList();                          // терминальная

Ленивость. Пока не вызвана терминальная операция, filter и map не выполняются вовсе. Классическая проверка на собеседовании: стрим с peek(System.out::println) без терминальной операции ничего не печатает.

Поэлементная обработка. Первый элемент проходит filter → map → limit, затем второй. Поэтому limit(10) останавливает обработку после десяти подходящих элементов, даже если источник бесконечен.

Промежуточные операции:

  • без состояния — filter, map, flatMap, peek;
  • с состоянием — sorted, distinct: должны накопить элементы;
  • короткого замыкания — limit, takeWhile.

Терминальные: collect, toList, reduce, forEach, count, min/max, anyMatch/allMatch/noneMatch, findFirst/findAny.

Стрим не изменяет источник и не хранит данные; после терминальной операции он израсходован.

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

  • Ленивость промежуточных и роль терминальной.
  • Поэлементная обработка и короткое замыкание.
  • Одноразовость стрима.

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

  • Переиспользовать уже использованный стрим.
  • Делать побочные эффекты в map.

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

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

Показать варианты и ответ
  • ✗Промежуточные сразу выполняются, терминальные ленивы
  • ✗Терминальных операций может быть несколько подряд
  • ✓Промежуточные ленивы и возвращают Stream; терминальная запускает обработку и даёт результат
  • ✗Без промежуточных операций стрим не запускается

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

  • Чем отличается map от flatMap?
  • Когда parallel stream вредит?

Разбор темы

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

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

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

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

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