Вопрос проверяет понимание жизненного цикла Stream и принципов работы Stream API.
Stream нельзя использовать повторно, потому что после терминальной операции он считается закрытым. Все элементы источника уже были обработаны или потреблены. Stream не хранит данные и не может начать обработку заново. Повторное использование приводит к исключению. Для новой обработки нужно создать новый Stream.
Stream API построен вокруг идеи одноразовой обработки данных.
Stream проходит три этапа:
Создание из источника
Построение цепочки операций
Выполнение терминальной операции
После третьего шага Stream закрывается навсегда.
Такое поведение:
упрощает реализацию ленивых вычислений
позволяет эффективно работать с большими данными
предотвращает неявное хранение состояния
Stream обрабатывает данные «на лету».
Если попытаться вызвать терминальную операцию повторно:
stream.forEach(...);
stream.count(); // IllegalStateException
JVM выбрасывает исключение, указывая на неверное состояние Stream.
Для повторной обработки:
создавать новый Stream из источника
либо сохранять данные в коллекцию
Пример:
List<Integer> list = ...
list.stream().forEach(...);
list.stream().count();
Вывод: одноразовость Stream — осознанное архитектурное решение, а не ограничение реализации.