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