集合 (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))、…

此頁面的貢獻者