Можно ли повторно использовать Stream в Java после его закрытия?

«Можно ли повторно использовать Stream в Java после его закрытия?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, повторно использовать 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.
  • Источник данных (коллекция, массив) при этом не изменяется и может использоваться многократно.