什么是collections的意见,什么时候你想要使用它们?
在Scala中,对于许多(所有?)types的集合,您可以创build视图。
什么是一个视图,为什么目的是有用的意见?
视图是非严格版本的集合。 这意味着元素是在访问时计算的,并不像在正常的集合中那样急切地计算。
以下面的代码为例:
val xs = List.tabulate(5)(_ + 1) val ys = xs.view map { x => println(x); x * x }
只是这不会打印任何东西,但每次访问列表将执行计算并打印值,即每次调用ys.head
将导致打印1
。 如果你想再次获得一个严格的集合版本,你可以调用它的force
。 在这种情况下,你会看到所有的数字打印出来。
一种用于视图的方法是,当你需要遍历一系列价值昂贵的计算值时,你一次只需要一个值。 也可以通过调用toStream
来构build惰性序列,也可以caching评估过的元素。
一个用例是当你需要收集元素转换的第一个结果时:
case class Transform(n: Int) { println("Transform "+n)} val list = List(1,2,3,4,5) list.view.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")}
打印:
Transform 1 Transform 2 Transform 3 found
而:
list.map(v => Transform(v)).collectFirst{case Transform(3) => println("found")}
打印:
Transform 1 Transform 2 Transform 3 Transform 4 Transform 5 found
查看来自Scala 2.8 Collections API的 视图 。
斯卡拉集合在默认情况下在所有变换器中都是严格的,除了
Stream
,它实现了所有的变换器方法。 然而,有一个系统的方法来把每一个集合变成一个懒惰的, 反之亦然 ,这是基于收集的意见。 视图是一种特殊的集合,它代表了一些基本的集合,但却懒散地实现了所有的变形。…
有两个原因可能会考虑使用视图。 首先是performance。 您已经看到,通过将集合切换到视图,可以避免构build中间结果。 这些节省可能相当重要。
…
第二个用例适用于可变序列的视图。 这些视图上的许多变换器函数为原始序列提供了一个窗口,然后可以select性地更新该序列中的某些元素。