您可以使用語法 List(1, 2, 3)
建立三個整數的清單,並使用 Map('A' -> 1, 'C' -> 2)
建立具有兩個繫結的映射。這實際上是 Scala 集合的通用功能。您可以取用任何集合名稱,並在括號中加上元素清單。結果將會是具有指定元素的新集合。以下是更多範例
val a = Iterable() // An empty collection
val b = List() // The empty list
val c = List(1.0, 2.0) // A list with elements 1.0, 2.0
val d = Vector(1.0, 2.0) // A vector with elements 1.0, 2.0
val e = Iterator(1, 2, 3) // An iterator returning three integers.
val f = Set(dog, cat, bird) // A set of three animals
val g = HashSet(dog, cat, bird) // A hash set of the same animals
val h = Map('a' -> 7, 'b' -> 0) // A map from characters to integers
「在幕後」以上每一行都是對某個物件的 apply
方法的呼叫。例如,上面第三行展開為
val c = List.apply(1.0, 2.0)
因此這是對 List
類別的伴隨物件的 apply
方法的呼叫。該方法會接受任意數量的引數,並根據這些引數建構一個清單。Scala 函式庫中的每個集合類別都有包含此類 apply
方法的伴隨物件。集合類別表示具體實作(例如 List
、LazyList
或 Vector
)或抽象基本類別(例如 Seq
、Set
或 Iterable
)並無所謂。在後一種情況下,呼叫 apply 會產生抽象基本類別的一些預設實作。範例
scala> List(1, 2, 3)
val res17: List[Int] = List(1, 2, 3)
scala> Iterable(1, 2, 3)
val res18: Iterable[Int] = List(1, 2, 3)
scala> mutable.Iterable(1, 2, 3)
val res19: scala.collection.mutable.Iterable[Int] = ArrayBuffer(1, 2, 3)
除了 apply
,每個集合伴隨物件也會定義一個成員 empty
,它會傳回一個空的集合。因此,您可以寫 List.empty
而不是 List()
,寫 Map.empty
而不是 Map()
,以此類推。
集合伴隨物件提供的作業摘要在下列表格中。簡而言之,有
concat
,它會串接任意數量的集合,fill
和tabulate
,它們會產生由某個運算式或製表函式初始化的單一或多維集合,其維度由給定的維度決定,range
,會產生具有某個常數步長的整數集合,以及iterate
和unfold
,會產生重複將某個函式套用至開始元素或狀態而產生的集合。
序列的工廠方法
它是什麼 | 它的作用 |
---|---|
C.empty |
空的集合。 |
C(x, y, z) |
包含元素 x, y, z 的集合。 |
C.concat(xs, ys, zs) |
透過串接 xs, ys, zs 的元素而取得的集合。 |
C.fill(n){e} |
長度為 n 的集合,其中每個元素都是透過運算式 e 計算出來的。 |
C.fill(m, n){e} |
維度為 m×n 的集合集合,其中每個元素都是透過運算式 e 計算出來的。(在更高的維度中也存在)。 |
C.tabulate(n){f} |
長度為 n 的集合,其中每個索引值 i 的元素都是透過 f(i) 計算出來的。 |
C.tabulate(m, n){f} |
維度為 m×n 的集合集合,其中每個索引值 (i, j) 的元素都是透過 f(i, j) 計算出來的。(在更高的維度中也存在)。 |
C.range(start, end) |
整數 start … end-1 的集合。 |
C.range(start, end, step) |
從 start 開始,並以 step 的增量遞增,直到(不包含)end 值的整數集合。 |
C.iterate(x, n)(f) |
長度為 n 的集合,元素為 x 、f(x) 、f(f(x)) ,… |
C.unfold(init)(f) |
一個集合,使用函數 f 從 init 狀態開始計算其下一個元素和狀態。 |