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