Ответ 1
Поток memoises, а Iterator - нет. Вы можете проходить один и тот же поток несколько раз и получать одинаковый результат каждый раз. Итератор, с другой стороны, может быть пройден только один раз.
Кажется, что итератор и поток ленивы и позволяют вам возвращать элементы к вашему сердечному содержимому. Какая разница между двумя?
Поток memoises, а Iterator - нет. Вы можете проходить один и тот же поток несколько раз и получать одинаковый результат каждый раз. Итератор, с другой стороны, может быть пройден только один раз.
Это обе конструкции для доступа к текущему элементу, имеющие еще неизвестный список оставшихся элементов (ленивый хвост).
Iterator
является обязательной конструкцией, которую вы можете только пересекать один раз.
Stream
- функциональная конструкция. Теоретически вы можете проходить его несколько раз (и, как упоминалось в других публикациях, он не будет компрометировать уже вычисленные части), но на практике, потому что потоки либо бесконечны, либо очень велики (именно поэтому вы его используете в первую очередь), удерживая ссылка на полный поток не имеет особого смысла (вы часто сталкиваетесь с Out Of Memory).
def
и никогда не помещать его в локальные переменные, которые имеют долговременную область действия.Stream
не ленив в своей голове, например
Как правило, разум лучше избегать простых Stream
s. Альтернативы используют EphemeralStream
Scalaz, который автоматически забывает незакрепленные части, используя слабые ссылки, или используя Iteratees (см. также здесь) или что-то похож.