【问题标题】:What's the difference between LazyList and Stream in Scala?Scala 中的 LazyList 和 Stream 有什么区别?
【发布时间】:2020-05-24 11:04:24
【问题描述】:

我注意到StreamScala 2.13 中已弃用,他们建议使用LazyList。 他们还说“使用 LazyList(完全惰性)而不是 Stream(只有惰性尾部)”。
它到底是什么意思?他们为什么弃用 Stream

【问题讨论】:

  • 基本上 Stream 只是在其 tail 上懒惰,因此始终计算 head。对于许多人来说,这令人惊讶并导致错误的代码。另一方面 LayzList 是完全惰性的。在调用它之前它不会计算头部。请注意,当您计算 LayzList 的头部时,也会计算其尾部,反之亦然。
  • 知道了。谢谢。
  • @LuisMiguelMejíaSuárez 是否有会导致错误代码的示例?
  • @MarioGalic 在正确的意义上没有错误。但在它的行为方式上是错误的。

标签: scala stream scala-collections lazylist


【解决方案1】:

根据blog post

LazyList 在 Stream 上是首选

Stream 已弃用,取而代之的是 LazyList。顾名思义,LazyList 是一个链表,其元素被延迟评估。与 Stream 的一个重要语义区别在于,在 LazyList 中 头部和尾部都是惰性的,而在 Stream 中只有尾部是惰性的

同样在Stream documentation:

已弃用(自 2.13.0 版起)

使用 LazyList(完全惰性)而不是 Stream(只有惰性尾部)

【讨论】:

    【解决方案2】:

    NthPortal,LazyList 的贡献者,在Update and improve LazyList docs #7842 中声明

    LazyListStream 的主要区别 - 及其主要特点 - 就是懒惰地评估它是否懒惰。我不知道 如何最好地传达这一点。

    related question 中的 jwvh 状态

    Stream 元素是惰性实现的,除了第一个(头)元素。 这被视为一种缺陷。

    Scala 2.13 发行说明state

    immutable.LazyList 替换 immutable.StreamStream 有不同的懒惰行为,现在已弃用。 (#7558, #7000)

    【讨论】:

      猜你喜欢
      • 2020-07-20
      • 2020-04-22
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2014-01-10
      • 2011-12-06
      • 2018-10-25
      • 2011-12-02
      相关资源
      最近更新 更多