迭代器和stream在Scala中的区别?

似乎Iterator和Stream都是懒惰的,并且允许你不断的返回元素到你的内心。 两者有什么区别?

streammemoises和迭代器不。 您可以遍历相同的stream多次,并获得相同的结果,每次。 而迭代器则只能遍历一次。

它们都是访问当前元素的构造,具有尚未知的剩余元素(懒惰的尾部)。

Iterator是一个必不可less的构造,你只能遍历一次。

Stream是一个function性的构造。 理论上你可以多次遍历它(和其他人提到的一样,它不会重新计算已经计算好的部分),但是在实践中,因为Streams是无限的或者非常大的(这就是为什么你首先使用它)参考完整的stream没有多大意义(你跑进内存很容易)。

  • 因此,你应该总是使用def定义stream,并且永远不要把它放到具有长寿命范围的局部variables中。
  • 在使用Streams编写recursion函数时也有微妙之处,
    • 请参阅Scala尾recursion在trait中定义的Stream处理函数保持对stream-head的引用
    • 如何在Scala中使用Stream.cons编写无泄漏的尾recursion函数? 。
  • 可能会出现一些意外的行为,因为Scala的Stream不是懒惰的
    • 如果mapper返回空结果链,则stream flatMap泄漏内存

一般来说避免简单的Stream是安全的。 替代方法是使用Scalaz的EphemeralStream ,它使用弱引用自动忘记未被使用的部分,或者使用迭代器 (参见这里 )或者类似的东西 。