Можно ли получить Iterator из Stream в Java?

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

Ответ

Да, можно. У Stream<T> есть метод iterator(), который возвращает Iterator<T>. Однако это действие является терминальной операцией и потребляет поток, после чего поток нельзя использовать повторно.

Пример:

Stream<String> stream = Stream.of("a", "b", "c");
Iterator<String> iterator = stream.iterator();

while (iterator.hasNext()) {
    System.out.println(iterator.next());
}
// Попытка вызвать другую терминальную операцию на 'stream' вызовет IllegalStateException

Важные нюансы:

  • Поток потребляется: После вызова iterator() поток считается закрытым.
  • Порядок в параллельных потоках: Для параллельных стримов (parallelStream) порядок элементов в возвращаемом итераторе не гарантирован.
  • Рекомендация: Предпочтительнее использовать методы самого Stream API (например, forEach, collect) вместо явной работы с итератором, чтобы сохранить преимущества потоковой обработки.