mirage-scalaでのイテレーション検索

Mirageでは検索結果のイテレーション処理を行う場合、IterationCallbackインターフェースを実装したコールバックを用意する必要があるのですが、mirage-scalaでは当然のように関数をコールバックとして渡せるようにしています。

var sum = 0
val result = sqlManager.iterate(classOf[Book],
  Sql("SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK"),
  (book: Book) => {
    sum = sum + book.price
    sum
  })

でも、これだけだと上の例みたいに外部で状態を保持するためにvarな変数が必要になってしまうので、foldLeftみたいに以下のような感じにしてもいいかも。前回のコールバック関数呼び出しの戻り値が次のコールバック関数呼び出しの引数として渡されます。初回呼び出し時の引数はSqlManager#iterate()メソッドの呼び出しで与えておきます。

val result = sqlManager.iterate(classOf[Book],
  Sql("SELECT BOOK_ID, BOOK_NAME, AUTHOR, PRICE FROM BOOK"),
  (book: Book, sum: Int) => {
    sum + book.price
  }, 0)

ただ、コールバック内で処理をしたいだけ(戻り値は別にいらない)というケースもあると思うので、そういう場合は無駄かな。両方のパターンができるといいのかも…。