【问题标题】:What is the difference between a view and a stream?视图和流有什么区别?
【发布时间】:2011-01-17 23:20:53
【问题描述】:

在 Scala 2.8 集合框架中,viewtoStream 有什么区别?

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

    在视图中,每次访问元素时都会重新计算它们。在流中,元素在评估时被保留。

    例如:

    val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2)
    println(doubled.mkString(" "))
    println(doubled.mkString(" "))
    

    将为每个元素重新评估地图两次。一次用于第一个 println,然后再次用于第二个。相比之下

    val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2)
    println(doubled.mkString(" "))
    println(doubled.mkString(" "))
    

    只会将元素加倍一次。

    视图就像创建集合的秘诀。当您请求视图的元素时,它每次都会执行配方。

    流就像一个人拿着一堆干擦卡片。这家伙知道如何计算集合的后续元素。你可以问他收藏的下一个元素,然后给你一张卡片,上面写着元素,还有一根绳子从卡片系在他的手指上(帮助他记住)。此外,在他给你一张卡片之前,他会解开他手指上的第一根绳子并将其系在新卡片上。

    如果您保留第一张卡片(即保留对流头部的引用),当您请求下一个元素时,您最终可能会用完卡片(即内存),但如果您不需要去回到第一个元素,您可以剪断绳子并将不需要的卡片交还给那个人,他可以重新使用它们(毕竟它们是干擦的)。这就是流可以表示无限序列而不会耗尽内存的方式。

    【讨论】:

    • @huynhj 你做对了。我可以更新答案以使其更清楚
    • 您可以按原样保留答案。有时比喻会有所帮助。在这种情况下,我对此感到困惑。第一句话就说明了一切。
    • 字符串例子很混乱。
    【解决方案2】:

    Geoffanswer 几乎涵盖了所有内容,但我想补充一点,Stream 是类似List 的序列,而每种集合(地图、集合、索引序列)都有视图。

    【讨论】:

    • 我有一个疑问。因为函数是纯粹的。为什么编译器不使用引用透明或记忆?为什么 view 又重新计算了?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多