Ответ
Нет, повторно использовать Stream после терминальной операции или закрытия нельзя. Поток (Stream) в Java предназначен для одноразового потребления данных.
Почему возникает ошибка?
После вызова любой терминальной операции (например, collect(), forEach(), count()) или метода close(), поток считается потреблённым (closed). Любая последующая попытка использовать этот же экземпляр Stream приведёт к IllegalStateException.
Stream<String> stream = Stream.of("A", "B", "C");
// Терминальная операция — поток потреблён
List<String> list = stream.collect(Collectors.toList());
// Попытка повторного использования выбросит исключение
long count = stream.count(); // IllegalStateException: stream has already been operated upon or closed
Как правильно работать с данными повторно? Необходимо создать новый поток из исходного источника данных:
List<String> sourceList = Arrays.asList("A", "B", "C");
// Первое использование
List<String> list1 = sourceList.stream().map(String::toLowerCase).collect(Collectors.toList());
// Второе использование — создаём новый поток из того же источника
long count = sourceList.stream().count(); // OK
Ключевые выводы:
- Stream — одноразовый.
- Для повторных операций создавайте новый Stream.
- Источник данных (коллекция, массив) при этом не изменяется и может использоваться многократно.