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