24

view在 Scala 2.8 集合框架中,和有什么区别toStream

4

2 回答 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 回答
10

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

于 2010-02-17T21:50:40.433 回答