什么是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性地更新该序列中的某些元素。