视图和流有什么区别?

时间:2010-02-17 17:08:00

标签: scala scala-2.8

在Scala 2.8集合框架中,viewtoStream之间有什么区别?

2 个答案:

答案 0 :(得分:41)

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

例如:

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(" "))

只会将元素翻倍。

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

一条小溪就像一个带有一堆干擦卡的家伙。这家伙知道如何计算集合的后续元素。您可以向他询问该系列的下一个元素,并为您提供一张卡片,上面写有元素,并将一条绳子从卡片绑到他的手指上(以帮助他记住)。此外,在他给你一张牌之前,他用手指解开第一根弦并将其绑在新卡上。

如果你抓住第一张卡片(即保留对流的头部的引用),当你要求下一个元素时,你可能最终会用完卡片(即内存),但是如果你不需要去回到第一个元素,你可以切断字符串并将不需要的卡片交还给那个人,他可以重复使用它们(它们是干擦后的)。这就是流如何表示无限序列而不会耗尽内存。

答案 1 :(得分:10)

Geoffanswer涵盖了几乎所有内容,但我想补充说StreamList类似的序列,而每种类型的集合(地图,集合,索引seqs)有视图。