Что такое Stream в Java?
- Чем Stream отличается от коллекции?
- Что такое промежуточные и терминальные операции?
- Можно ли использовать стрим дважды?
Stream — конвейер обработки элементов источника: данные не хранит и источник не меняет.
- Промежуточные операции (filter, map, sorted) ленивые; запускает всё терминальная (collect, count, forEach)
- Стрим одноразовый: повторный проход → IllegalStateException
А ещё Это не InputStream и не коллекция; parallel() — не волшебная кнопка ускорения
Подробно
Stream API описывает, что сделать с данными, а не как их перебрать. Конвейер строится из трёх частей:
- источник — коллекция (
list.stream()), массив,Stream.of, генератор, строки файла; - промежуточные операции —
filter,map,flatMap,sorted,distinct,limit. Они ленивые: только добавляют шаг в конвейер; - терминальная операция —
collect,toList,count,reduce,forEach,anyMatch. Только она запускает вычисление.
Ленивость даёт эффективность: элементы проходят все шаги по одному, а findFirst или anyMatch останавливают обработку, как только ответ найден.
Важные свойства:
- стрим не хранит данные и не меняет источник — результат возвращается новым значением;
- стрим одноразовый — после терминальной операции его нельзя использовать повторно;
- лямбды в стримах не должны менять внешнее состояние — иначе получаются трудноуловимые ошибки, особенно в
parallel().
Параллельные стримы используют общий пул и выгодны только на больших объёмах вычислений без блокировок.
Пример
List<String> topBuyers = orders.stream()
.filter(o -> o.total() > 5000)
.map(Order::customerName)
.distinct()
.sorted()
.limit(10)
.toList();Что хотят услышать
- Стрим как конвейер, который не хранит данные и не меняет источник.
- Промежуточные и терминальные операции, ленивость.
- Одноразовость.
- Отличие от InputStream — плюс.
Частые ошибки
- Ожидать, что операции изменят исходную коллекцию.
- Пытаться обойти один и тот же конвейер дважды.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Конвейер над источником: не хранит данные и не меняет коллекцию
- ✗Новый вид коллекции, оптимизированный для чтения
- ✗Механизм параллельного выполнения задач в пуле потоков
- ✗Поток ввода-вывода для чтения файлов
Что спросят дальше
- Чем промежуточные операции отличаются от терминальных?
- Почему порядок операций в конвейере влияет на объём работы?
Разбор темы
- Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
Связанные вопросы
- В конвейере стоят filter и map. Почему порядок filter перед map обычно предпочтительнее обратного? Middle
- Переменной присвоили Stream, вызвали count(), а затем на той же переменной вызвали forEach(). Что произойдёт? Middle
- Чем map, flatMap и filter отличаются в Stream API? Middle
- Чем промежуточные операции Stream отличаются от терминальных? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.