集合(Scala 2.8 - 2.12)

从头开始创建集合

语言

您有语法 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 方法的伴随对象。无论集合类表示具体实现(如 ListStreamVector)还是抽象基类(如 SeqSetTraversable),都没有关系。在后一种情况下,调用 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,它将任意数量的可遍历对象连接在一起,
  • filltabulate,它们生成单维或多维序列,这些序列具有给定的维度,并由某个表达式或制表函数初始化,
  • 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) 整数序列 startend-1
S.range(start, end, step) 整数序列,从 start 开始,以 step 为增量递增,直到(但不包括)end 值。
S.iterate(x, n)(f) 长度为 n 的序列,元素为 xf(x)f(f(x)),…

此页面的贡献者