Они оба являются конструкциями для доступа к текущему элементу, имея еще неизвестный список оставшихся элементов (ленивый хвост).
Iterator
- это императивная конструкция, которую вы можете пройти только один раз.
Stream
является функциональной конструкцией. Теоретически вы можете проходить его несколько раз (и, как уже упоминалось, он не будет пересчитывать уже вычисленные части), но на практике, потому что потоки либо бесконечны, либо очень велики (именно поэтому вы используете его в первую очередь), удерживая ссылка на полный поток не имеет особого смысла (вы легко сталкиваетесь с нехваткой памяти).
- Поэтому вы должны всегда определять потоки, используя
def
, и никогда не помещать его в локальные переменные, которые имеют долгоживущий объем.
- Есть также тонкости при написании рекурсивных функций с использованием Streams,
- Может быть какое-то неожиданное поведение, вызванное тем, что
Stream
Скалы не ленив в голове, как
Обычно разуму безопаснее избегать простых Stream
с. В качестве альтернативы используется EphemeralStream
из Scalaz, который автоматически забывает ненужные части, используя слабые ссылки, или Итерирует (см. Также здесь ) или что-то похожее .