【问题标题】:What is the difference between List.view and LazyList?List.view 和 LazyList 有什么区别?
【发布时间】:2020-04-22 12:59:58
【问题描述】:

我是 Scala 的新手,我刚刚了解到 LazyList 是为了替换 Stream 而创建的,同时他们将 .view 方法添加到所有集合中。

所以,我想知道为什么 LazyList 添加到 Scala 集合库中,而我们可以这样做 List.view

我刚看了Scaladoc,似乎唯一的区别是LazyList有记忆,而View没有。我是对还是错?

【问题讨论】:

  • 遗憾的是,我觉得这里没有一个真正完整的答案。我仍然不明白拥有两者的好处。视图现在看起来毫无用处,因为它们缺少许多方法,但我可能会缺少一些东西......
  • 那里有一些提示但仍不全面:baeldung.com/scala/stream-vs-views-vs-iterators

标签: scala lazy-evaluation scala-collections


【解决方案1】:

Stream 元素被延迟实现除了第一个(头)元素。这被视为一种缺陷。

List 视图被延迟重新评估,但据我所知,必须首先完全实现。

def bang :Int = {print("BANG! ");1}

LazyList.fill(4)(bang)  //res0: LazyList[Int] = LazyList(<not computed>)
Stream.fill(3)(bang)    //BANG! res1: Stream[Int] = Stream(1, <not computed>)
List.fill(2)(bang).view //BANG! BANG! res2: SeqView[Int] = SeqView(<not computed>)

【讨论】:

  • 这是有道理的,但我是从已经有一个视图和一个列表的角度来谈论的,而不是从你获得它们之前发生的事情的角度来看,而是很好的答案!我也没有想过这个。
  • 嘿_你!那很有意思。正如 jwh 所描述的,人们通常关心每一点懒惰。我猜“重新评估”是指地图等变换。
  • 只是想知道,因为我是 Scala 新手,我的“转到”Seq 集合应该是什么?向量? @som-snytt 关于强制 btw 的要点!
【解决方案2】:

在 2.13 中,您不能强行从视图返回到原始集合类型:

scala> case class C(n: Int) { def bump = new C(n+1).tap(i => println(s"bump to $i")) }
defined class C

scala> List(C(42)).map(_.bump)
bump to C(43)
res0: List[C] = List(C(43))

scala> List(C(42)).view.map(_.bump)
res1: scala.collection.SeqView[C] = SeqView(<not computed>)

scala> .force
            ^
       warning: method force in trait View is deprecated (since 2.13.0): Views no longer know about their underlying collection type; .force always returns an IndexedSeq
bump to C(43)
res2: scala.collection.IndexedSeq[C] = Vector(C(43))

scala> LazyList(C(42)).map(_.bump)
res3: scala.collection.immutable.LazyList[C] = LazyList(<not computed>)

scala> .force
bump to C(43)
res4: res3.type = LazyList(C(43))

如果调用者需要选择结果类型,则采用视图并可选择返回严格实现的函数还必须采用“强制函数”,例如 _.toList

我在日常工作中不会做这种事情,但这种行为让我感到惊讶。

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 2020-05-24
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    相关资源
    最近更新 更多