在集合階層的最上方是特質 Traversable
。它唯一的抽象運算為 foreach
def foreach[U](f: Elem => U)
實作 Traversable
的集合類別只需要定義此方法;所有其他方法都可以從 Traversable
繼承。
foreach
方法是用來遍歷集合中的所有元素,並對每個元素套用給定的運算 f。運算的類型為 Elem => U
,其中 Elem
是集合元素的類型,而 U
是任意結果類型。呼叫 f
僅是為了其副作用;事實上,foreach
會捨棄 f 的任何函數結果。
Traversable
也定義許多具體方法,這些方法都列在以下表格中。這些方法分為以下幾類
- 加法,
++
,將兩個可遍歷集合串接在一起,或將迭代器的所有元素串接到可遍歷集合中。 - Map 運算
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 |
從 xs 中每個元素套用函式 f 所取得的集合。 |
xs flatMap f |
從 xs 中每個元素套用集合值函式 f ,並串接結果所取得的集合。 |
xs collect f |
從 xs 中每個元素套用部分函式 f ,並收集結果所取得的集合。 |
轉換 | |
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 個元素複製到陣列 arr ,從索引 s 開始。最後兩個參數是可選的。 |
大小資訊 | |
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 切片 (from, to) |
由 xs 的某個索引範圍內元素組成的集合 (從 from 到 to ,不包含 to )。 |
xs 取用 n |
由 xs 的前 n 個元素組成的集合 (或某些任意 n 個元素,如果未定義順序)。 |
xs 捨棄 n |
除了 xs 取用 n 之外的其餘集合。 |
xs 取用滿足 p |
集合中元素的最長前綴,所有元素都滿足 p 。 |
xs 捨棄滿足 p |
集合,不包含元素的最長前綴,所有元素都滿足 p 。 |
xs 過濾 p |
由滿足謂詞 p 的 xs 元素組成的集合。 |
xs 搭配過濾 p |
此集合的非嚴格過濾。後續呼叫 map 、flatMap 、foreach 和 withFilter 將只套用於 xs 中條件 p 為 true 的元素。 |
xs 過濾不滿足 p |
由不滿足謂詞 p 的 xs 元素組成的集合。 |
細分 | |
xs 在 n 處拆分 |
在某個位置分割 xs ,產生一對集合 (xs 取前 n 個,xs 捨棄前 n 個) 。 |
xs span p |
根據一個謂詞分割 xs ,產生一對集合 (xs 取用滿足 p 的,xs 捨棄滿足 p 的) 。 |
xs partition p |
將 xs 分割成一對集合;一個是滿足謂詞 p 的元素,另一個是不滿足的元素,產生一對集合 (xs 過濾 p,xs.不過濾 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 view (from, to) |
產生一個檢視,表示 xs 中某些索引範圍內的元素。 |