代码之家  ›  专栏  ›  技术社区  ›  Craig P. Motlin

风景和溪流有什么区别?

  •  22
  • Craig P. Motlin  · 技术社区  · 15 年前

    在scala 2.8collections框架中, view toStream ?

    2 回复  |  直到 15 年前
        1
  •  41
  •   Geoff Reedy    15 年前

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

    例如:

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

    将对每个元素的映射重新求值两次。第一次打印一次,第二次打印一次。相反

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

    只会使元素加倍一次。

    视图就像创建集合的配方。当你要求一个视图的元素时,它每次都会执行配方。

    一条小溪就像一个拿着一堆干洗卡的人。他知道如何计算集合的后续元素。你可以向他索要收藏品的下一个元素,然后给你一张卡片,卡片上写着元素,卡片上的绳子绑在他的手指上(帮助他记忆)。另外,在他给你一张卡片之前,他会解开手指上的第一根绳子,然后把它绑在新卡片上。

    如果你抓住第一张卡片(即保持对流头的引用),当你要求下一个元素时,你可能最终会用完卡片(即内存),但是如果你不需要回到第一个元素,你可以剪断字符串,把不需要的卡片交还给他,他会再利用它们(它们毕竟是干抹掉的)。这就是流如何表示无限序列而不耗尽内存的方法。

        2
  •  10
  •   Community CDub    7 年前

    Geoff answer 几乎涵盖了所有内容,但我想补充一点 Stream 是一个 List -就像sequence,而每种集合(映射、集合、索引seq)都有视图。