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