Java と Scala 間のコレクションの変換 トップ イテレータ コレクションの作成 目次
最新版は Scala Documentation に移行しました。

コレクションの作成

List(1, 2, 3) 構文によって 3つの整数から成るリストを作成でき、Map('A' -> 1, 'C' -> 2) 構文によって 2つの写像から成るマップを作成することができる。これは Scala コレクションの統一された機能だ。どのコレクションを取っても、その名前に括弧付けされた要素のリストを付け加えることができる。結果は渡された要素から成る新しいコレクションだ。以下に具体例で説明する:

Traversable()             // 空の traversable オブジェクト
List()                    // 空のリスト
List(1.02.0)            // 要素 1.0, 2.0 を含むリスト
Vector(1.02.0)          // 要素 1.0, 2.0 を含むベクトル
Iterator(123)         // 3つの整数を返すイテレータ
Set(dog, cat, bird)       // 3種類の動物の集合
HashSet(dog, cat, bird)   // 同じ動物のハッシュ集合
Map(a -> 7'b' -> 0)     // 文字から整数へのマップ

上の全ての行での呼び出しは内部では何らかのオブジェクトの apply メソッドを呼び出している。例えば、3行目は以下のように展開する:

List.apply(1.02.0)

つまり、これは List クラスのコンパニオンオブジェクトの apply メソッドを呼び出している。このメソッドは任意の数の引数を取り、それを使ってリストを構築する。Scala ライブラリの全てのコレクションクラスには、コンパニオンオブジェクトがあり、そのような apply メソッドを定義する。コレクションクラスが ListStream、やVector のような具象実装を表しているのか、SeqSet、や Traversable のような抽象基底クラスを表しているのかは関係ない。後者の場合は、apply の呼び出しは抽象基底クラスの何らかのデフォルト実装を作成するだけのことだ。用例:

scala> List(123)
res0: List[Int] = List(2, 3, 4)
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 を継承するクラスは、コンパニオンオブジェクトにおいて他の factory 演算を提供する。以下の表にこれらの演算をまとめた。要約すると、

列の factory 演算  
使用例 振る舞い

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 より始まり end 未満まで step づつ増加する整数の列。
S.iterate(x, n)(f) 要素 x, f(x), f(f(x)), ... から成る長さ n の列。

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


Java と Scala 間のコレクションの変換 トップ イテレータ コレクションの作成 目次