Scala 有3 种主要的集合类型:
-
List—有序的对象集合;
-
Set—无序的集合;
-
Map—键值对字典。
Scala 推崇不可变集合,尽管也可以使用可变版本。如果想要修改集合,而且集合上所有的操作都在单线程中进行,那么就可以选择可变集合。但是,如果打算跨线程、跨Actor 地使用集合,那么不可变集合将会是更好的选择。不可变集合是线程安全的,不受副作用影响,并且有助于程序的正确性。可以通过选择下列两个包之一来选择所使用的版本:scala.collection.mutable 或者scala.collection.immutable。
默认情况下,Scala 会使用不可变集合。下面就以使用 Set 的例子来稍微介绍Scala集合,其他的集合类型也有以下特性。
val colors1 = Set("Blue", "Green", "Red") println(s"colors1: $colors1") val colors2 = colors1 + "Black" println(s"colors2: $colors2") println(s"colors1: $colors1")
我们从一个具有 3 种颜色的Set 开始。当添加了"Black"时,我们并没有修改原始的集合。相反,我们得到了一个具有4 个元素的新集合,正如我们在下面所看到的:
colors1: Set(Blue, Green, Red) colors2: Set(Blue, Green, Red, Black) colors1: Set(Blue, Green, Red)
在默认情况下,得到的是不可变集合。因为(被默认包含的)Predef 对象为Set 和Map提供了别名,指向的是不可变的实现。Set 和Map 是scala.collection 包中的特质,在scala.collection.mutable 包中有其可变版本的实现,而在scala.collection.immutable 包中有其不可变版本的实现。
在前面的示例中,我们没有使用 new 关键字来创建Set 的实例。在内部,Scala 创建了内部类Set3 的一个实例,正如我们在下面所看到的:
scala> val colors = Set("Blue", "Green", "Red") colors: scala.collection.immutable.Set[String] = Set(Blue, Green, Red) scala> colors.getClass res0: Class[_ <: scala.collection.immutable.Set[String]] = class scala.collection.immutable.Set$Set3 scala> :quit
Set3 是一个表示具有3 个元素的集合的实现的类。因为Set 是不可变的,并且必须要在构造时提供值,所以Scala 针对元素较少的Set 优化了具体实现,并为大于4 个元素的值创建HashSet 的实现。
根据所提供的参数,Scala 发现我们需要的是一个Set[String]。同样地,如果是Set(1,2,3),那么我们将会得到一个Set[Int]。因为特殊的apply()方法(也被称为工厂方法),所以才得以创建一个对象而又不用使用new 关键字。类似于X(...)这样的语句,其中X 是一个类的名称或者一个实例的引用,将会被看作是X.apply(...)。如果对应的方法存在,Scala 会自动调用这个类的伴生对象上的apply()方法。这种隐式调用apply()方法的能力也可以在Map 和List 上找到。
下面具体介绍各集合的特性和使用方法: