Geo*_*edy 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(" "))
只会将元素加倍一次.
视图就像创建集合的配方.当您要求视图的元素时,它每次都会执行配方.
流就像一个有一堆干擦卡的家伙.这家伙知道如何计算集合的后续元素.您可以向他询问该系列的下一个元素,并为您提供一张卡片,上面写有元素,并将一条绳子从卡片绑到他的手指上(以帮助他记住).此外,在他给你一张牌之前,他用手指解开第一根弦并将其绑在新牌上.
如果你持有到第一张牌(即保持到流的头部的引用),你可能最终耗尽的卡(即内存),当你问下一个元素,但如果你并不需要去回第一个元素,你可以切断字符串,并将不需要的卡片交还给那个人,他可以重复使用它们(它们是干擦后的).这就是流如何表示无限序列而不会耗尽内存.
| 归档时间: | 
 | 
| 查看次数: | 2254 次 | 
| 最近记录: |