在集合层次结构的顶部是特征 Traversable
。其唯一的抽象操作是 foreach
def foreach[U](f: Elem => U)
实现 Traversable
的集合类只需要定义此方法;所有其他方法都可以从 Traversable
继承。
foreach
方法旨在遍历集合的所有元素,并将给定的操作 f 应用于每个元素。操作的类型是 Elem => U
,其中 Elem
是集合元素的类型,U
是任意结果类型。调用 f
仅是为了产生副作用;事实上,f 的任何函数结果都会被 foreach
丢弃。
Traversable
还定义了许多具体方法,所有这些方法都列在下面的表格中。这些方法分为以下几类
- 加法,
++
,将两个可遍历对象连接在一起,或将迭代器的所有元素连接到可遍历对象。 - 映射操作
map
、flatMap
和collect
,通过对集合元素应用一些函数来生成一个新集合。 - 转换
toArray
、toList
、toIterable
、toSeq
、toIndexedSeq
、toStream
、toSet
、toMap
,将Traversable
集合转换为更具体的内容。如果集合的运行时类型已与所需集合类型匹配,则所有这些转换都会返回其接收者参数不变。例如,将toList
应用于列表将生成列表本身。 - 复制操作
copyToBuffer
和copyToArray
。顾名思义,这些操作分别将集合元素复制到缓冲区或数组中。 - 大小信息操作
isEmpty
、nonEmpty
、size
和hasDefiniteSize
:可遍历集合可以是有限的或无限的。无限可遍历集合的一个示例是自然数流Stream.from(0)
。方法hasDefiniteSize
指示集合是否可能无限。如果hasDefiniteSize
返回 true,则集合肯定有限。如果它返回 false,则集合尚未完全展开,因此可能是无限的或有限的。 - 元素检索操作
head
、last
、headOption
、lastOption
和find
。这些操作选择集合中的第一个或最后一个元素,或者选择满足条件的第一个元素。但是,请注意,并非所有集合都对“第一个”和“最后一个”的含义有明确的定义。例如,哈希集可能会根据元素的哈希键存储元素,这些键可能会在每次运行时发生变化。在这种情况下,哈希集的“第一个”元素对于程序的每次运行也可能不同。如果集合始终以相同的顺序生成其元素,则该集合为有序集合。大多数集合是有序的,但有些集合(例如哈希集)不是有序的——放弃顺序会带来一些额外的效率。顺序通常对于提供可重复的测试和帮助调试至关重要。这就是 Scala 集合为所有集合类型提供有序备选方案的原因。例如,HashSet
的有序备选方案是LinkedHashSet
。 - 子集合检索操作
tail
、init
、slice
、take
、drop
、takeWhile
、dropWhile
、filter
、filterNot
、withFilter
。这些操作都返回由索引范围或某个谓词标识的某个子集合。 - 细分操作
splitAt
、span
、partition
、groupBy
,这些操作将此集合的元素拆分为多个子集合。 - 元素测试
exists
、forall
、count
,这些操作使用给定的谓词测试集合元素。 - 折叠
foldLeft
、foldRight
、/:
、:\
、reduceLeft
、reduceRight
,这些操作对连续的元素应用二元运算。 - 特定折叠
sum
、product
、min
、max
,这些操作处理特定类型(数字或可比较类型)的集合。 - 字符串操作
mkString
、addString
、stringPrefix
,这些操作提供了将集合转换为字符串的备选方法。 - 视图操作,由
view
方法的两个重载变体组成。视图是一个延迟求值的集合。您将在 稍后 了解更多有关视图的信息。
Traversable 类中的操作
它是什么 | 它做什么 |
---|---|
抽象方法 | |
xs foreach f |
对 xs 的每个元素执行函数 f 。 |
添加 | |
xs ++ ys |
一个集合,由 xs 和 ys 的元素组成。 ys 是一个 TraversableOnce 集合,即 Traversable 或 Iterator。 |
映射 | |
xs map f |
从将函数 f 应用到 xs 中的每个元素而获得的集合。 |
xs flatMap f |
从将基于集合的函数 f 应用到 xs 中的每个元素并连接结果而获得的集合。 |
xs collect f |
从将部分函数 f 应用到 xs 中的每个已定义元素并收集结果而获得的集合。 |
转换 | |
xs.toArray |
将集合转换为数组。 |
xs.toList |
将集合转换为列表。 |
xs.toIterable |
将集合转换为可迭代对象。 |
xs.toSeq |
将集合转换为序列。 |
xs.toIndexedSeq |
将集合转换为索引序列。 |
xs.toStream |
将集合转换为延迟计算的流。 |
xs.toSet |
将集合转换为集合。 |
xs.toMap |
将键/值对集合转换为映射。如果集合不包含对作为元素,则调用此操作会导致静态类型错误。 |
复制 | |
xs copyToBuffer buf |
将集合的所有元素复制到缓冲区 buf 。 |
xs copyToArray(arr, s, n) |
将集合中最多 n 个元素复制到从索引 s 开始的数组 arr 中。最后两个参数是可选的。 |
尺寸信息 | |
xs.isEmpty |
测试集合是否为空。 |
xs.nonEmpty |
测试集合是否包含元素。 |
xs.size |
集合中的元素数量。 |
xs.hasDefiniteSize |
如果已知xs 具有有限大小,则为 True。 |
元素检索 | |
xs.head |
集合的第一个元素(或某些元素,如果未定义顺序)。 |
xs.headOption |
xs 的第一个元素(以选项值形式),如果xs 为空,则为 None。 |
xs.last |
集合的最后一个元素(或某些元素,如果未定义顺序)。 |
xs.lastOption |
xs 的最后一个元素(以选项值形式),如果xs 为空,则为 None。 |
xs find p |
一个选项,其中包含xs 中第一个满足p 的元素,或者如果没有任何元素符合条件,则包含None 。 |
子集合 | |
xs.tail |
集合的其余部分,除了xs.head 。 |
xs.init |
集合的其余部分,除了xs.last 。 |
xs slice (from, to) |
一个集合,其中包含xs 的某个索引范围内的元素(从from 开始,到to 结束,但不包括to )。 |
xs take n |
一个集合,其中包含xs 的前n 个元素(或某些任意n 个元素,如果未定义顺序)。 |
xs drop n |
集合的其余部分,除了xs take n 。 |
xs takeWhile p |
集合中元素的最长前缀,所有元素都满足p 。 |
xs dropWhile p |
集合,其中不包含最长前缀,所有元素都满足p 。 |
xs filter p |
集合,其中包含满足谓词p 的那些 xs 元素。 |
xs withFilter p |
此集合的非严格筛选器。对 map 、flatMap 、foreach 和 withFilter 的后续调用仅适用于条件 p 为真时 xs 的那些元素。 |
xs filterNot p |
由 xs 中不满足谓词 p 的那些元素组成的集合。 |
细分 | |
xs splitAt n |
在某个位置拆分 xs ,得到集合对 (xs take n, xs drop n) 。 |
xs span p |
根据谓词拆分 xs ,得到集合对 (xs takeWhile p, xs.dropWhile p) 。 |
xs partition p |
将 xs 拆分为一对集合;一个包含满足谓词 p 的元素,另一个包含不满足谓词的元素,得到集合对 (xs filter p, xs.filterNot p) |
xs groupBy f |
根据判别函数 f 将 xs 分区到集合映射中。 |
元素条件 | |
xs forall p |
一个布尔值,指示谓词 p 是否适用于 xs 的所有元素。 |
xs exists p |
一个布尔值,指示谓词 p 是否适用于 xs 中的某个元素。 |
xs count p |
满足谓词 p 的 xs 中的元素数量。 |
折叠 | |
(z /: xs)(op) |
在 xs 的连续元素之间应用二元运算 op ,从左到右,从 z 开始。 |
(xs :\ z)(op) |
在 xs 的连续元素之间应用二元运算 op ,从右到左,从 z 开始。 |
xs.foldLeft(z)(op) |
与 (z /: xs)(op) 相同。 |
xs.foldRight(z)(op) |
与 (xs :\ z)(op) 相同。 |
xs reduceLeft op |
对非空集合 xs 的连续元素应用二元运算 op ,从左到右。 |
xs reduceRight op |
对非空集合 xs 的连续元素应用二元运算 op ,从右到左。 |
特定折叠 | |
xs.sum |
集合 xs 的数值元素值的总和。 |
xs.product |
集合 xs 的数值元素值的乘积。 |
xs.min |
集合 xs 的有序元素值的最小值。 |
xs.max |
集合 xs 的有序元素值的最大值。 |
字符串 | |
xs addString (b, start, sep, end) |
将字符串添加到 StringBuilder b 中,该字符串显示 xs 的所有元素,它们位于分隔符 sep 之间,并用字符串 start 和 end 括起来。 start 、sep 、end 均为可选。 |
xs mkString (start, sep, end) |
将集合转换为字符串,该字符串显示 xs 的所有元素,它们位于分隔符 sep 之间,并用字符串 start 和 end 括起来。 start 、sep 、end 均为可选。 |
xs.stringPrefix |
从 xs.toString 返回的字符串开头处的集合名称。 |
视图 | |
xs.view |
生成 xs 的视图。 |
xs 视图 (from, to) |
生成一个视图,表示 xs 的某个索引范围内的元素。 |