似乎Iterator和Stream都是懒惰的,并且允许您将元素保留在心脏的内容中。这两者有什么区别?
答案 0 :(得分:46)
Stream memoises而Iterator没有。您可以多次遍历同一个Stream并且每次都获得相同的结果。另一方面,迭代器只能遍历一次。
答案 1 :(得分:19)
它们都是用于访问当前元素的构造,具有尚未知的剩余元素列表(惰性尾部)。
Iterator
是一个命令式构造,你只能遍历一次。
Stream
是一个功能构造。从理论上讲,你可以多次遍历它(正如其他人提到的,它不会重新计算已经计算过的部分),但实际上因为Streams要么无限大,要么非常大(这就是你首先使用它的原因),持有对完整流的引用没有多大意义(你很容易遇到Out Of Memory)。
def
定义流,并且永远不要将其放入具有长期范围的局部变量中。Stream
并非懒惰,因此可能会出现一些意想不到的行为,例如
一般来说,避免普通Stream
是更安全的。替代方案是使用EphemeralStream
Scalaz,它使用弱引用自动忘记未推荐的部分,或使用Iteratees(另请参阅here)或something similiar。