過時公告
您有語法 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
方法的伴侶物件。無論蒐集類別表示具體實作(例如 List
、Stream
或 Vector
)或抽象基礎類別(例如 Seq
、Set
或 Traversable
),這都沒有關係。在後一種情況下,呼叫 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
,它會串接任意數量的可遍歷項目,fill
和tabulate
,產生單一或多維度的序列,由給定的維度初始化,並由某些表達式或製表函數初始化。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) |
整數序列 start … end-1 。 |
S.range(start, end, step) |
從 start 開始的整數序列,以 step 增量遞增,直到(不包含)end 值。 |
S.iterate(x, n)(f) |
長度為 n 的序列,元素為 x 、f(x) 、f(f(x)) 、… |