过时通知
Seq 特征表示序列。序列是一种可迭代的对象,它具有 length,并且其元素具有从 0 开始的固定索引位置。
序列上的操作(下表中总结)属于以下类别
- 索引和长度操作
apply、isDefinedAt、length、indices和lengthCompare。对于Seq,apply操作表示索引;因此,类型为Seq[T]的序列是一个部分函数,它接受一个Int参数(索引),并生成一个类型为T的序列元素。换句话说,Seq[T]扩展了PartialFunction[Int, T]。序列的元素从零开始索引,直到序列的length减一。序列上的length方法是通用集合的size方法的别名。lengthCompare方法允许您将序列的长度与一个 Int 进行比较,即使序列具有无限长度。 - 索引搜索操作
indexOf、lastIndexOf、indexOfSlice、lastIndexOfSlice、indexWhere、lastIndexWhere、segmentLength、prefixLength,它们返回一个等于给定值或匹配某个谓词的元素的索引。 - 添加操作
+:、:+、padTo,它们返回通过在序列的开头或结尾添加元素而获得的新序列。 - 更新操作
updated、patch,它们返回通过替换原始序列中某些元素而获得的新序列。 - 排序操作
sorted、sortWith、sortBy,这些操作根据各种条件对序列元素进行排序。 - 反转操作
reverse、reverseIterator、reverseMap,这些操作以相反的顺序产生或处理序列元素。 - 比较
startsWith、endsWith、contains、containsSlice、corresponds,这些操作将两个序列关联起来或在序列中搜索元素。 - 多重集 操作
intersect、diff、union、distinct,这些操作对两个序列的元素执行类似集合的操作或删除重复项。
如果序列是可变的,它还提供一个产生副作用的 update 方法,该方法允许更新序列元素。与 Scala 中一贯的做法一样,seq(idx) = elem 这样的语法只是 seq.update(idx, elem) 的简写,因此 update 免费提供了方便的赋值语法。请注意 update 和 updated 之间的区别。update 就地更改序列元素,并且仅适用于可变序列。updated 适用于所有序列,并且始终返回一个新序列,而不是修改原始序列。
Seq 类中的操作
| 是什么 | 做什么 |
|---|---|
| 索引和长度 | |
xs(i) |
(或者写成 xs apply i)。索引为 i 的 xs 元素。 |
xs isDefinedAt i |
测试 i 是否包含在 xs.indices 中。 |
xs.length |
序列的长度(与 size 相同)。 |
xs lengthCompare n |
如果 xs 短于 n,则返回 -1,如果更长,则返回 +1,如果长度为 n,则返回 0。即使序列是无限的,此方法也能正常工作,例如 Stream.from(1) lengthCompare 42 等于 +1。 |
xs.indices |
从 0 延伸到 xs.length - 1 的 xs 的索引范围。 |
| 索引搜索 | |
xs indexOf x |
xs 中等于 x 的第一个元素的索引(有几种变体)。 |
xs lastIndexOf x |
xs 中等于 x 的最后一个元素的索引(有几种变体)。 |
xs indexOfSlice ys |
xs 的第一个索引,从该索引开始的连续元素形成序列 ys。 |
xs lastIndexOfSlice ys |
xs 的最后一个索引,从该索引开始的连续元素形成序列 ys。 |
xs indexWhere p |
xs 中满足 p 的第一个元素的索引(有几种变体)。 |
xs segmentLength (p, i) |
xs 中元素的最长不间断段的长度,从 xs(i) 开始,所有元素都满足谓词 p。 |
xs prefixLength p |
xs 中元素的最长前缀的长度,所有元素都满足谓词 p。 |
| 添加 | |
x +: xs |
一个新序列,由 x 前置于 xs 组成。 |
xs :+ x |
一个新序列,由 x 附加到 xs 组成。 |
xs padTo (len, x) |
将值 x 附加到 xs,直到达到长度 len,由此产生的序列。 |
| 更新 | |
xs patch (i, ys, r) |
从 i 开始用修补程序 ys 替换 xs 的 r 个元素,由此产生的序列。 |
xs updated (i, x) |
xs 的副本,其中索引 i 处的元素被 x 替换。 |
xs(i) = x |
(或者写成 xs.update(i, x),仅适用于 mutable.Seq)。将 xs 中索引 i 处的元素更改为 x。 |
| 排序 | |
xs.sorted |
使用 xs 元素类型的标准排序对 xs 的元素进行排序后获得的新序列。 |
xs sortWith lt |
使用 lt 作为比较操作对 xs 的元素进行排序后获得的新序列。 |
xs sortBy f |
对 xs 的元素进行排序后获得的新序列。对两个元素之间的比较通过对这两个元素映射函数 f 并比较结果来进行。 |
| 反转 | |
xs.reverse |
一个序列,其中包含 xs 的元素,顺序相反。 |
xs.reverseIterator |
一个迭代器,生成 xs 的所有元素,顺序相反。 |
xs reverseMap f |
一个序列,通过对 xs 的元素按相反顺序映射 f 获得。 |
| 比较 | |
xs startsWith ys |
测试 xs 是否以序列 ys 开头(有多种变体)。 |
xs endsWith ys |
测试 xs 是否以序列 ys 结尾(有多种变体)。 |
xs contains x |
测试 xs 是否有等于 x 的元素。 |
xs containsSlice ys |
测试 xs 是否有等于 ys 的连续子序列。 |
(xs corresponds ys)(p) |
测试 xs 和 ys 的相应元素是否满足二元谓词 p。 |
| 多重集操作 | |
xs intersect ys |
序列 xs 和 ys 的多重集交集,保留 xs 中元素的顺序。 |
xs diff ys |
序列 xs 和 ys 的多重集差集,保留 xs 中元素的顺序。 |
xs union ys |
多重集并集;与 xs ++ ys 相同。 |
xs.distinct |
不包含重复元素的 xs 子序列。 |
Trait Seq 有两个子 trait LinearSeq 和 IndexedSeq。它们不会添加任何新操作,但各自提供不同的性能特征:线性序列具有高效的 head 和 tail 操作,而索引序列具有高效的 apply、length 和(如果可变)update 操作。常用的线性序列是 scala.collection.immutable.List 和 scala.collection.immutable.Stream。常用的索引序列是 scala.Array 和 scala.collection.mutable.ArrayBuffer。 Vector 类在索引访问和线性访问之间提供了一个有趣的折衷方案。它既具有恒定时间的索引开销,又具有恒定时间的线性访问开销。因此,向量是同时使用索引访问和线性访问的混合访问模式的良好基础。您将在 后面 了解更多有关向量的知识。
缓冲区
可变序列的一个重要子类别是 Buffer。它们不仅允许更新现有元素,还允许插入元素、移除元素以及在缓冲区末尾高效添加新元素。缓冲区支持的主要新方法是 += 和 ++=(用于在末尾添加元素)、+=: 和 ++=:(用于在开头添加元素)、insert 和 insertAll(用于插入元素)以及 remove 和 -=(用于移除元素)。下表总结了这些操作。
两个经常使用的缓冲区实现是 ListBuffer 和 ArrayBuffer。顾名思义,ListBuffer 由 List 支持,并支持将其元素有效地转换为 List,而 ArrayBuffer 由数组支持,并且可以快速转换为数组。
Buffer 类中的操作
| 是什么 | 做什么 |
|---|---|
| 添加 | |
buf += x |
将元素 x 追加到缓冲区,并将 buf 本身作为结果返回。 |
buf += (x, y, z) |
将给定的元素追加到缓冲区。 |
buf ++= xs |
将 xs 中的所有元素追加到缓冲区。 |
x +=: buf |
将元素 x 前置到缓冲区。 |
xs ++=: buf |
将 xs 中的所有元素前置到缓冲区。 |
buf insert (i, x) |
在缓冲区的索引 i 处插入元素 x。 |
buf insertAll (i, xs) |
在缓冲区的索引 i 处插入 xs 中的所有元素。 |
| 删除 | |
buf -= x |
从缓冲区中删除元素 x。 |
buf remove i |
从缓冲区中删除索引 i 处的元素。 |
buf remove (i, n) |
从缓冲区中删除从索引 i 开始的 n 个元素。 |
buf trimStart n |
从缓冲区中删除前 n 个元素。 |
buf trimEnd n |
从缓冲区中删除后 n 个元素。 |
buf.clear() |
从缓冲区中删除所有元素。 |
| 克隆 | |
buf.clone |
一个与 buf 具有相同元素的新缓冲区。 |