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