Чем промежуточные операции Stream отличаются от терминальных?
Промежуточные операции (filter, map, sorted) ленивы и возвращают новый Stream — они только описывают конвейер. Терминальная (collect, forEach, count, findFirst) запускает обработку и возвращает результат или побочный эффект. Без терминальной ничего не выполнится.
- Стрим одноразовый: после терминальной — IllegalStateException
- Элементы идут по конвейеру по одному, а не этапами
- Короткое замыкание: findFirst, anyMatch, limit останавливают обработку рано
А ещё sorted и distinct — промежуточные с состоянием: им нужно увидеть все элементы
Подробно
Конвейер = источник + цепочка промежуточных операций + одна терминальная.
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 вредит?
Разбор темы
- Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.