view
在 Scala 2.8 集合框架中,和有什么区别toStream
?
问问题
3070 次
2 回答
45
在视图中元素每次被访问时都会重新计算。在流中,元素在评估时被保留。
例如:
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(" "))
只会将元素加倍一次。
视图就像创建集合的秘诀。当您请求视图的元素时,它每次都会执行配方。
一条溪流就像一个拿着一堆干擦卡片的人。这家伙知道如何计算集合的后续元素。您可以向他询问该系列的下一个元素,并给您一张写有元素的卡片,并在卡片上系一根绳子到他的手指上(帮助他记住)。此外,在他给你一张卡片之前,他会解开手指上的第一根绳子并将其系在新卡片上。
如果您保留第一张卡片(即保留对流头部的引用),当您请求下一个元素时,您最终可能会用完卡片(即内存),但如果您不需要返回首先,您可以剪断绳子并将不需要的卡片交还给那个人,他可以重新使用它们(毕竟它们是干擦的)。这就是流可以表示无限序列而不会耗尽内存的方式。
于 2010-02-17T17:25:34.653 回答