共通する演算の摘出 トップ ビルダ 目次

ビルダ

  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] = ...
  }
Builder クラスの概要

ほぼ全てのコレクション演算は探索 (traversal) かビルダ (builder) に基づいて実装されている。探索は Traversableforeach メソッドが担当し、新しいコレクションの構築は 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()
戻り値 bldr は配列バッファ buf を用いて要素を収集するビルダだ。bldr に戻り値を要請すると、buf の戻り値が計算され、配列バッファ buf 自身を返す。この配列バッファは _.toArray によって配列に転換される。結果的に bldr は、配列のビルダとなる。

続いては、共通する演算の摘出


共通する演算の摘出 トップ ビルダ 目次