Scala中Iterator和Stream之间的区别?

rye*_*guy 57 scala

似乎Iterator和Stream都是懒惰的,并且允许您将元素保留在心脏的内容中.这两者有什么区别?

Wal*_*ang 48

记忆和迭代器没有.您可以多次遍历同一个Stream并且每次都获得相同的结果.另一方面,迭代器只能遍历一次.

  • 流备忘录? (9认同)
  • @ryeguy这是O(n)因为Stream构建了一个链接列表来缓存元素值. (7认同)
  • 这是否意味着在无限长的流的情况下,内存使用将继续增加,因为Stream记忆结果并且永远不会丢弃它们? (3认同)
  • @lolski:是的,如果你某处有一个对流的*first cell*的引用就是这种情况.另一方面,如果您在读取更多元素时覆盖对第一个单元格的引用,则之前的元素将被垃圾收集.所以你必须要小心一点,这样你在使用大流时就不会抓住第一个元素. (2认同)

ron*_*ron 21

它们都是用于访问当前元素的构造,具有尚未知的剩余元素列表(惰性尾部).

Iterator 是一个命令式的构造,你只能遍历一次.

Stream是一种功能性结构.从理论上讲,你可以多次遍历它(正如其他人提到的那样,它不会重新计算已经计算过的部分),但实际上因为Streams要么无限大,要么非常大(这就是你首先使用它的原因),持有对完整流的引用没有多大意义(你很容易遇到Out Of Memory).

一般来说,避免平常更安全Stream.替代方案是使用EphemeralStreamScalaz,它使用弱引用自动忘记未推荐的部分,或使用Iteratees(也见此处)或类似的东西.