【发布时间】:2010-12-04 10:03:34
【问题描述】:
Iterator 和 Stream 似乎都是惰性的,可以让你不断地返回元素,让你心满意足。两者有什么区别?
【问题讨论】:
标签: scala
Iterator 和 Stream 似乎都是惰性的,可以让你不断地返回元素,让你心满意足。两者有什么区别?
【问题讨论】:
标签: scala
流memoises 而迭代器没有。你可以多次遍历同一个Stream,每次都得到相同的结果。另一方面,迭代器只能被遍历一次。
【讨论】:
它们都是用于访问当前元素的构造,具有未知的剩余元素列表(惰性尾部)。
Iterator 是一个命令式构造,您只能遍历一次。
Stream 是一个函数构造。理论上你可以多次遍历它(正如其他人提到的,它不会重新计算已经计算的部分),但实际上因为 Streams 要么是无限的要么非常大(这就是你首先使用它的原因),持有引用完整的流没有多大意义(你很容易遇到内存不足)。
def 定义流,并且永远不要将其放入具有长期作用域的局部变量中。Stream 头脑并不懒惰,这可能会导致一些意想不到的行为,例如
一般来说,避免简单的Streams 对大脑来说更安全。替代方案是使用 Scalaz 的 EphemeralStream,它使用弱引用自动忘记未引用的部分,或者使用 Iteratees(另见 here)或 something similiar。
【讨论】: