ビルダ | 目次 |
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() |
続いては、共通する演算の摘出
ビルダ | 目次 |