Кажется, что итератор и поток ленивы и позволяют вам возвращать элементы в содержание вашего сердца. В чем разница между ними?Разница между Iterator и Stream в Scala?
ответ
Поток memoises и Итератор нет. Вы можете проходить один и тот же поток несколько раз и получать одинаковый результат каждый раз. Итератор, с другой стороны, может быть пройден только один раз.
Это обе конструкции для доступа к текущему элементу, имеющие еще неизвестный список оставшихся элементов (ленивый хвост).
Iterator
- это императивная конструкция, которую вы можете пройти только один раз.
Stream
- функциональная конструкция. Теоретически вы можете проходить его несколько раз (и, как упоминалось в других публикациях, он не будет компрометировать уже вычисленные части), но на практике, потому что потоки либо бесконечны, либо очень велики (именно поэтому вы его используете в первую очередь), удерживая ссылка на полный поток не имеет особого смысла (вы легко справляетесь с Out Of Memory).
- Поэтому вы должны всегда определить потоки с помощью
def
и никогда не ставили его в локальные переменные, которые имеют долгоживущую сферу. - Есть также тонкости при написании рекурсивных функций с использованием потоков,
- Там могут быть некоторые неожиданное поведение в результате того, что в Scala
Stream
не является ленивым в его голове, как
Вообще безопаснее для ума избегать простых Stream
s. Альтернативы используют EphemeralStream
Scalaz, который автоматически забывает незакрепленные детали, используя слабые ссылки, или используя Iteratees (см. Также here) или something similiar.
Мне любопытно: почему EphemeralStream не является реализацией по умолчанию? Вы всегда можете восстановить забытую часть из линии данных (ее функциональный язык). Это звучит как большой недостаток дизайна. – tribbloid
- 1. Разница между Iterator и Listiterator?
- 2. Разница между Iterator и Iterable
- 3. Scala Iterator/Stream с известным размером
- 4. разница между Scala «+:» и «::»
- 5. Разница между accessorIterator, iterator и methodIterator
- 6. Разница между collection.find(). Stream() и collection.find(). BatchSize (100) .stream()?
- 7. Java Stream: разница между forEach и forEachOrdered
- 8. Scala Stream/Iterator, который генерирует имена столбцов Excel?
- 9. Какова связь между Iterable и Iterator?
- 10. Разница между reduceByKey (_ + _) и reduceByKey (_ ++ _) в Scala
- 11. Разница между нефатальным и Exception в Scala
- 12. Разница между «HashSet» и «Set» в Scala?
- 13. Разница между точкой и пробелом в Scala
- 14. Разница между asInstanceOf [] и isInstanceOf [] в scala
- 15. Разница между == и === в scala, искра
- 16. Разница между сканированием и scanLeft в Scala
- 17. Разница в производительности между конструкцией Iterator и конструкцией foreach
- 18. Разница между интерфейсами Iterator и Iterable в соответствии с SE8
- 19. scalaz Iteratees от scala Iterator
- 20. Scala Infinite Iterator OutOfMemory
- 21. Scala Iterator ++ ударяет стек
- 22. Tail on scala iterator
- 23. В чем разница между .foreach и .stream(). Foreach?
- 24. В чем разница между строкой stream clear и str
- 25. разница между Java необязательными и Scala Option
- 26. Scala: разница между стилем и ADT?
- 27. Anorm Scala Разница между executeUpdate и executeInsert
- 28. Convert java.util.stream.Stream to Scala Stream
- 29. Scala: Разница между декларациями функций
- 30. В чем разница между: и +:
Что касается memoization - если я обращаюсь к элементу Nth, это время доступа O (1) или O (N)? – ryeguy
@ryeguy Это O (n), потому что Stream создает связанный список для кеширования значений элементов. –
Хорошо, так в чем же разница между Stream и Iterable? –