集合 (Scala 2.8 - 2.12)

特質 Traversable

語言

在集合階層的最上方是特質 Traversable。它唯一的抽象運算為 foreach

def foreach[U](f: Elem => U)

實作 Traversable 的集合類別只需要定義此方法;所有其他方法都可以從 Traversable 繼承。

foreach 方法是用來遍歷集合中的所有元素,並對每個元素套用給定的運算 f。運算的類型為 Elem => U,其中 Elem 是集合元素的類型,而 U 是任意結果類型。呼叫 f 僅是為了其副作用;事實上,foreach 會捨棄 f 的任何函數結果。

Traversable 也定義許多具體方法,這些方法都列在以下表格中。這些方法分為以下幾類

  • 加法++,將兩個可遍歷集合串接在一起,或將迭代器的所有元素串接到可遍歷集合中。
  • Map 運算 mapflatMapcollect,透過對集合元素套用某些函數來產生新的集合。
  • 轉換 toArraytoListtoIterabletoSeqtoIndexedSeqtoStreamtoSettoMap,將 Traversable 集合轉換成更具體的集合。如果集合的執行時期類型已符合要求的集合類型,所有這些轉換都會傳回未變更的接收器參數。例如,對清單套用 toList 會產生清單本身。
  • 複製運算 copyToBuffercopyToArray。顧名思義,這些運算分別將集合元素複製到緩衝區或陣列中。
  • 大小資訊操作 isEmptynonEmptysizehasDefiniteSize:可遍歷的集合可以是有限或無限的。無限可遍歷集合的範例是自然數串流 Stream.from(0)。方法 hasDefiniteSize 指出集合是否可能是無限的。如果 hasDefiniteSize 傳回 true,則集合肯定是有限的。如果傳回 false,則集合尚未完全建構,因此可能是無限或有限的。
  • 元素擷取 操作 headlastheadOptionlastOptionfind。這些操作會選取集合中的第一個或最後一個元素,或者選取符合條件的第一個元素。但請注意,並非所有集合都對「第一個」和「最後一個」有明確的定義。例如,雜湊集合可能會根據元素的雜湊金鑰儲存元素,而這些金鑰可能會在每次執行時變更。在這種情況下,雜湊集合的「第一個」元素也可能在每次執行程式時不同。如果集合總是按相同順序產生其元素,則該集合為有序集合。大多數集合都是有序的,但有些集合(例如雜湊集合)不是有序的,捨棄順序會帶來一點額外的效率。順序通常對於提供可重現的測試和協助除錯至關重要。這就是 Scala 集合為所有集合類型提供有序替代方案的原因。例如,HashSet 的有序替代方案是 LinkedHashSet
  • 子集合擷取操作 tailinitslicetakedroptakeWhiledropWhilefilterfilterNotwithFilter。這些操作都會傳回由索引範圍或某個謂詞識別的子集合。
  • 子區段操作 splitAtspanpartitiongroupBy,將此集合的元素拆分為多個子集合。
  • 元素測試 existsforallcount,使用特定謂詞測試集合元素。
  • 摺疊 foldLeftfoldRight/::\reduceLeftreduceRight,對連續元素套用二元運算。
  • 特定摺疊 sumproductminmax,用於特定類型(數字或可比較)的集合。
  • 字串 操作 mkStringaddStringstringPrefix,提供將集合轉換為字串的替代方式。
  • 檢視 操作,包含 view 方法的兩個重載變體。檢視是延遲評估的集合。您將在 稍後 進一步了解檢視。

Traversable 類別中的操作

它是什麼 它做什麼
抽象方法  
xs foreach f xs 的每個元素執行函式 f
加法  
xs ++ ys 一個集合,包含 xsys 中的元素。 ysTraversableOnce 集合,即 TraversableIterator
映射  
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 的某個索引範圍內元素組成的集合 (從 fromto,不包含 to)。
xs 取用 n xs 的前 n 個元素組成的集合 (或某些任意 n 個元素,如果未定義順序)。
xs 捨棄 n 除了 xs 取用 n 之外的其餘集合。
xs 取用滿足 p 集合中元素的最長前綴,所有元素都滿足 p
xs 捨棄滿足 p 集合,不包含元素的最長前綴,所有元素都滿足 p
xs 過濾 p 由滿足謂詞 p 的 xs 元素組成的集合。
xs 搭配過濾 p 此集合的非嚴格過濾。後續呼叫 mapflatMapforeachwithFilter 將只套用於 xs 中條件 p 為 true 的元素。
xs 過濾不滿足 p 由不滿足謂詞 pxs 元素組成的集合。
細分  
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 滿足謂詞 pxs 中的元素數量。
摺疊  
(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 之間,並以字串 startend 包住。 startsepend 皆為選用。
xs mkString (start, sep, end) 將集合轉換為字串,顯示 xs 中所有元素,介於分隔符號 sep 之間,並以字串 startend 包住。 startsepend 皆為選用。
xs.stringPrefix xs.toString 傳回的字串開頭的集合名稱。
檢視  
xs.view xs 上產生一個檢視。
xs view (from, to) 產生一個檢視,表示 xs 中某些索引範圍內的元素。

此頁面的貢獻者