![]() |
![]() |
![]() |
ビルダ | 目次 |
| package scala.collection.generic | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| class Builder[-Elem, +To] { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def +=(elem: Elem): this.type | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def result(): To | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def clear() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| def mapResult(f: To => NewTo): Builder[Elem, NewTo] = ... | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } |
ほぼ全てのコレクション演算は探索 (traversal) かビルダ (builder) に基づいて実装されている。探索は Traversable の foreach メソッドが担当し、新しいコレクションの構築は Builder クラスのインスタンスが担当する。前述のコードは、このクラスを多少簡略化したものを示す。
b += x を用いて、要素 x をビルダ b に追加できる。 b += (x, y) やバッファの b ++= xs のように、複数の要素を一度に追加する構文も用意されている。(実は、バッファはビルダを強力にしたものだ。)result() メソッドはビルダからコレクションを返す。戻り値を返した後のビルダの状態は未定義だが、clear() によって新たな空の状態に初期化できる。ビルダは、ビルダが返すコレクションの型 To と要素型 Elem の両方についてジェネリックである。
ビルダは、他のビルダを用いてコレクションの要素を組み立てたいが、その結果を(例えば別の型にするなど)変換したいと思うことがよくある。このような作業は Builder クラスの mapResult メソッドを用いれば簡単にできる。ここで、配列バッファの buf があると仮定する。配列バッファは自身のビルダであるので、配列バッファの result() は同じバッファを返す。このバッファを使って配列を構築するビルダを生成したい場合は、以下のように mapResult を用いる:
| scala> val buf = new ArrayBuffer[Int] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| buf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| scala> val bldr = buf mapResult (_.toArray) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| bldr: scala.collection.mutable.Builder[Int,Array[Int]] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| = ArrayBuffer() |
続いては、共通する演算の摘出
![]() |
![]() |
![]() |
ビルダ | 目次 |