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