Разница между Iterator и Stream в Scala?

Кажется, что итератор и поток ленивы и позволяют вам возвращать элементы к вашему сердечному содержимому. Какая разница между двумя?

Ответ 1

Поток memoises, а Iterator - нет. Вы можете проходить один и тот же поток несколько раз и получать одинаковый результат каждый раз. Итератор, с другой стороны, может быть пройден только один раз.

Ответ 2

Это обе конструкции для доступа к текущему элементу, имеющие еще неизвестный список оставшихся элементов (ленивый хвост).

Iterator является обязательной конструкцией, которую вы можете только пересекать один раз.

Stream - функциональная конструкция. Теоретически вы можете проходить его несколько раз (и, как упоминалось в других публикациях, он не будет компрометировать уже вычисленные части), но на практике, потому что потоки либо бесконечны, либо очень велики (именно поэтому вы его используете в первую очередь), удерживая ссылка на полный поток не имеет особого смысла (вы часто сталкиваетесь с Out Of Memory).

Как правило, разум лучше избегать простых Stream s. Альтернативы используют EphemeralStream Scalaz, который автоматически забывает незакрепленные части, используя слабые ссылки, или используя Iteratees (см. также здесь) или что-то похож.