【问题标题】:Difference between Iterator and Stream in Scala?Scala中迭代器和流之间的区别?
【发布时间】:2010-12-04 10:03:34
【问题描述】:

Iterator 和 Stream 似乎都是惰性的,可以让你不断地返回元素,让你心满意足。两者有什么区别?

【问题讨论】:

    标签: scala


    【解决方案1】:

    memoises 而迭代器没有。你可以多次遍历同一个Stream,每次都得到相同的结果。另一方面,迭代器只能被遍历一次。

    【讨论】:

    • 关于记忆 - 如果我访问第 N 个元素,访问时间是 O(1) 还是 O(N)?
    • @ryeguy 这是 O(n),因为 Stream 构建了一个链表来缓存元素值。
    • 好的,那么Stream和Iterable有什么区别呢?
    • 是否意味着在无限长的流的情况下,由于Stream会记住结果并且永远不会丢弃它们,因此内存使用量会不断增加?
    • @lolski:是的,如果您在某处引用了流的第一个单元格,就会出现这种情况。另一方面,如果您在读取更多元素时覆盖对第一个单元格的引用,那么较早的元素将被垃圾收集。所以你必须小心一点,以免在处理大流时不要抓住第一个元素。
    【解决方案2】:

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

    Iterator 是一个命令式构造,您只能遍历一次。

    Stream 是一个函数构造。理论上你可以多次遍历它(正如其他人提到的,它不会重新计算已经计算的部分),但实际上因为 Streams 要么是无限的要么非常大(这就是你首先使用它的原因),持有引用完整的流没有多大意义(你很容易遇到内存不足)。

    一般来说,避免简单的Streams 对大脑来说更安全。替代方案是使用 Scalaz 的 EphemeralStream,它使用弱引用自动忘记未引用的部分,或者使用 Iteratees(另见 here)或 something similiar

    【讨论】:

    • 我很好奇:为什么 EphemeralStream 不是默认实现?您始终可以从数据沿袭(它是一种功能语言)中重建被遗忘的部分。这听起来像是一个很大的设计缺陷。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2013-06-16
    • 2011-01-25
    • 1970-01-01
    • 2011-12-07
    • 2021-02-19
    相关资源
    最近更新 更多