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

Что такое Stream в Java?

JuniorЛямбды и Stream APIJava >=8
Ещё спрашивают так:
  • Чем Stream отличается от коллекции?
  • Что такое промежуточные и терминальные операции?
  • Можно ли использовать стрим дважды?
Коротко

Stream — конвейер обработки элементов источника: данные не хранит и источник не меняет.

  • Промежуточные операции (filter, map, sorted) ленивые; запускает всё терминальная (collect, count, forEach)
  • Стрим одноразовый: повторный проход → IllegalStateException

А ещё Это не InputStream и не коллекция; parallel() — не волшебная кнопка ускорения

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

Подробно

Stream API описывает, что сделать с данными, а не как их перебрать. Конвейер строится из трёх частей:

  1. источник — коллекция (list.stream()), массив, Stream.of, генератор, строки файла;
  2. промежуточные операции — filter, map, flatMap, sorted, distinct, limit. Они ленивые: только добавляют шаг в конвейер;
  3. терминальная операция — 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 — плюс.

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

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

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

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

Показать варианты и ответ
  • ✓Конвейер обработки элементов источника: он не хранит данные и не изменяет исходную коллекцию
  • ✗Новый вид коллекции, оптимизированный для чтения
  • ✗Поток ввода-вывода для чтения файлов
  • ✗Механизм параллельного выполнения задач в пуле

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

  • Чем промежуточные операции отличаются от терминальных?
  • Почему порядок операций в конвейере влияет на объём работы?

Разбор темы

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

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

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

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

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