在Scala 2.8集合框架中,view
和toStream
有什么区别?
最佳答案
在 View 中,元素在每次访问时都会重新计算。在流中,元素将在评估时保留。
例如:
val doubled = List(1,2,3,4,5,6,7,8,9,10).view.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))
将重新评估每个元素的 map 两次。一次用于第一个println,第二次用于第二个。相反
val doubled = List(1,2,3,4,5,6,7,8,9,10).toStream.map(_*2)
println(doubled.mkString(" "))
println(doubled.mkString(" "))
只会使元素加倍一次。
View 就像创建集合的配方。当您请求 View 元素时,它将每次执行配方。
溪流就像一个拿着一堆干擦卡的家伙。这家伙知道如何计算集合的后续元素。您可以要求他提供集合的下一个元素,并给您一张卡片,上面写有该元素,并在卡片和他的手指之间绑上一条绳子(以帮助他记住)。同样,在他给您一张卡之前,他先将手指上的第一根线解开,然后将其与新卡绑在一起。
如果您握住第一张卡(即保持对流的开头的引用),则当您要求下一个元素时,最终可能会用完卡(即内存),但是如果您不需要返回到首先,您可以剪断绳子并将不需要的卡片交给家伙,然后他可以重复使用它们(毕竟它们是干擦的)。这就是流可以表示无限序列而不会耗尽内存的方式。