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

Переменной присвоили Stream, вызвали count(), а затем на той же переменной вызвали forEach(). Что произойдёт?

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

IllegalStateException: stream has already been operated upon or closed. Стрим — одноразовый конвейер над источником, а не хранилище данных.

  • Нужен повторный обход — сохранить источник или Supplier<Stream<T>>
  • Изменять источник во время работы стрима — ConcurrentModificationException
  • Стримы из файлов (Files.lines) нужно закрывать — try-with-resources

А ещё Собрать в список и стримить его заново — тоже вариант

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

Подробно

Стрим не хранит данные, а описывает конвейер обработки над источником, и после выполнения считается израсходованным. Если нужен повторный обход, сохраняют не стрим, а источник, либо заводят Supplier<Stream<T>>, создающий свежий конвейер по требованию. Смежная ошибка того же рода — изменение источника во время выполнения конвейера: это интерференция, которая приводит к ConcurrentModificationException или к непредсказуемому результату. Полезно помнить и о том, что промежуточные операции ленивы: без терминальной операции конвейер не выполняется вовсе, поэтому одинокий filter без последующего сбора не сделает ничего.

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

  • Исключение и причина.
  • Как получить повторный обход.

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

  • Хранить стрим в поле или передавать его для повторного использования.
  • Менять исходную коллекцию внутри операций стрима.

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

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

Показать варианты и ответ
  • ✓IllegalStateException: стрим можно обойти только один раз, после терминальной операции он закрыт
  • ✗forEach отработает по тем же элементам заново
  • ✗forEach ничего не выведет, но и ошибки не будет
  • ✗Будет брошено ConcurrentModificationException

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

  • Как организовать повторный обход тех же данных?
  • Что произойдёт с конвейером без терминальной операции?

Разбор темы

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

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

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

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

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