JavaとScalaのコレクションの変換トップイテレータコレクションをゼロから作成する目次

コレクションをゼロから作成する

List(1, 2, 3)という構文で3つの整数を持つリストを作成でき、Map('A' -> 1, 'C' -> 2)で2つの束縛を持つマップを作成できます。 これは実はScalaコレクションの普遍的な機能です。 任意のコレクション名を選んでその後に要素の括弧で囲われたリストを続けられます。 結果は与えられた要素を含む新しいコレクションとなります。 これはさらなる例です:

Traversable()             // An empty traversable object
List()                    // The empty list
List(1.02.0)            // A list with elements 1.0, 2.0
Vector(1.02.0)          // A vector with elements 1.0, 2.0
Iterator(123)         // 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メソッドの呼び出しです。 例えば上記の3行目は以下のように展開できます。

List.apply(1.02.0)

つまりこれはListクラスのコンパニオンオブジェクトに対するapplyメソッドの呼び出しです。 このメソッドは任意の数の引数を取り、そこからリストを構築します。 Scalaライブラリの全てのコレクションクラスはこのようなapplyメソッドを持つコンパニオンオブジェクトを備えています。 コレクションクラスがListStreamVectorのように具体的な実装であるか、 SeqSetTraversableのように抽象的な基底クラスであるかは関係ありません。 後者の場合、applyの呼び出しは抽象基底クラスの何らかのデフォルト実装を生成します。 例:

scala> List(123)
res17: List[Int] = List(1, 2, 3)
scala> Traversable(123)
res18: Traversable[Int] = List(1, 2, 3)
scala> mutable.Traversable(123)
res19: scala.collection.mutable.Traversable[Int] = ArrayBuffer(1, 2, 3)

applyの他に、全てのコレクションのコンパニオンオブジェクトは空コレクションを返すemptyメンバも定義します。 そのためList()の代わりにList.emptyと書け、Map()の代わりにMap.emptyと言った風に書けます。

Seqクラスの子孫はコンパニオンオブジェクトで他のファクトリ演算も提供します。 それらは以下の表に要約できます。 手短に言えば以下のものがあります。

列のファクトリメソッド
何であるか何をするか
S.empty 空列。
S(x, y, z) 要素x, y, zからなる列。
S.concat(xs, ys, zs) xs, ys, zsの要素を連結して得られる列。
S.fill(n){e} 各要素が式eで計算される長さnの列。
S.fill(m, n){e} 各要素がeで計算される、次元がm×nである列の列(より高次元のものもある)。
S.tabulate(n){f} 添字iにある各要素がf(i)で計算される長さnの列。
S.tabulate(m, n){f} 添字(i, j)にある各要素がf(i, j)で計算される次元がm×nである列の列(より高次元のものもある)。
S.range(start, end) 整数列start ... end-1
S.range(start, end, step) startから始まり、stepずつ進み、endを含まずend値まで増加する整数列。
S.iterate(x, n)(f) 要素x, f(x), f(f(x)), ...からなる長さnの列。

続いては: JavaとScalaのコレクションの変換


JavaとScalaのコレクションの変換トップイテレータコレクションをゼロから作成する目次