您可以使用语法 List(1, 2, 3)
创建一个包含三个整数的列表,使用 Map('A' -> 1, 'C' -> 2)
创建一个包含两个绑定的映射。这实际上是 Scala 集合的一个通用功能。您可以使用任何集合名称,并用括号中的元素列表跟在它后面。结果将是一个包含给定元素的新集合。这里有一些其他示例
val a = Iterable() // An empty collection
val b = List() // The empty list
val c = List(1.0, 2.0) // A list with elements 1.0, 2.0
val d = Vector(1.0, 2.0) // A vector with elements 1.0, 2.0
val e = Iterator(1, 2, 3) // An iterator returning three integers.
val f = Set(dog, cat, bird) // A set of three animals
val g = HashSet(dog, cat, bird) // A hash set of the same animals
val h = Map('a' -> 7, 'b' -> 0) // A map from characters to integers
在“底层”,上述每一行都是对某个对象的 apply
方法的调用。例如,上面的第三行扩展为
val c = List.apply(1.0, 2.0)
因此,这是对 List
类的伴生对象的 apply
方法的调用。该方法采用任意数量的参数,并根据这些参数构造一个列表。Scala 库中的每个集合类都有一个具有此类 apply
方法的伴生对象。无论集合类表示的是具体实现(如 List
、LazyList
或 Vector
),还是抽象基类(如 Seq
、Set
或 Iterable
),都没有关系。在后一种情况下,调用 apply 将生成抽象基类的某个默认实现。示例
scala> List(1, 2, 3)
val res17: List[Int] = List(1, 2, 3)
scala> Iterable(1, 2, 3)
val res18: Iterable[Int] = List(1, 2, 3)
scala> mutable.Iterable(1, 2, 3)
val res19: scala.collection.mutable.Iterable[Int] = ArrayBuffer(1, 2, 3)
除了 apply
,每个集合伴生对象还定义了一个成员 empty
,它返回一个空集合。因此,你可以用 List.empty
替换 List()
,用 Map.empty
替换 Map()
,以此类推。
集合伴生对象提供的操作总结在以下表格中。简而言之,有
concat
,它将任意数量的集合连接在一起,fill
和tabulate
,它们生成由某个表达式或制表函数初始化的给定维度的单维或多维集合,range
,它生成步长为某个常数的整数集合,以及iterate
和unfold
,它们生成通过对起始元素或状态重复应用函数而产生的集合。
序列的工厂方法
它是什么 | 它做什么 |
---|---|
C.empty |
空集合。 |
C(x, y, z) |
由元素 x, y, z 组成的集合。 |
C.concat(xs, ys, zs) |
通过连接 xs, ys, zs 的元素获得的集合。 |
C.fill(n){e} |
长度为 n 的集合,其中每个元素由表达式 e 计算得出。 |
C.fill(m, n){e} |
维度为 m×n 的集合集合,其中每个元素由表达式 e 计算得出。(在更高维度中也存在)。 |
C.tabulate(n){f} |
长度为 n 的集合,其中每个索引 i 处的元素由 f(i) 计算得出。 |
C.tabulate(m, n){f} |
维度为 m×n 的集合集合,其中每个索引 (i, j) 处的元素由 f(i, j) 计算得出。(在更高维度中也存在)。 |
C.range(start, end) |
整数集合 start … end-1 。 |
C.range(start, end, step) |
从 start 开始的整数集合,以 step 为增量递增,直到(不包括)end 值。 |
C.iterate(x, n)(f) |
长度为 n 的集合,其中元素为 x ,f(x) ,f(f(x)) ,… |
C.unfold(init)(f) |
一个集合,它使用函数 f 从 init 状态开始计算其下一个元素和状态。 |