Переменной присвоили Stream, вызвали count(), а затем на той же переменной вызвали forEach(). Что произойдёт?
IllegalStateException: stream has already been operated upon or closed. Стрим — одноразовый конвейер над источником, а не хранилище данных.
- Нужен повторный обход — сохранить источник или Supplier<Stream<T>>
- Изменять источник во время работы стрима — ConcurrentModificationException
- Стримы из файлов (Files.lines) нужно закрывать — try-with-resources
А ещё Собрать в список и стримить его заново — тоже вариант
Подробно
Стрим не хранит данные, а описывает конвейер обработки над источником, и после выполнения считается израсходованным. Если нужен повторный обход, сохраняют не стрим, а источник, либо заводят Supplier<Stream<T>>, создающий свежий конвейер по требованию. Смежная ошибка того же рода — изменение источника во время выполнения конвейера: это интерференция, которая приводит к ConcurrentModificationException или к непредсказуемому результату. Полезно помнить и о том, что промежуточные операции ленивы: без терминальной операции конвейер не выполняется вовсе, поэтому одинокий filter без последующего сбора не сделает ничего.
Что хотят услышать
- Исключение и причина.
- Как получить повторный обход.
Частые ошибки
- Хранить стрим в поле или передавать его для повторного использования.
- Менять исходную коллекцию внутри операций стрима.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓IllegalStateException: стрим обходится только один раз
- ✗forEach отработает по тем же элементам заново, источник ведь не изменился
- ✗forEach ничего не выведет, но и ошибки не будет
- ✗Будет брошено ConcurrentModificationException
Что спросят дальше
- Как организовать повторный обход тех же данных?
- Что произойдёт с конвейером без терминальной операции?
Разбор темы
- Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.