以下のような集計処理を行うメソッドがあるとします。
def aggregate(id: String): Int ={
...
}
このメソッドを使って特定のIDに対する集計結果の合計を求めるコードがあります。
val result = Seq("rikunabi", "mynavi", "en")
.map { id => aggregate(id) }.sum
ただし、aggregate
メソッドは実行に時間がかかるので並列化したいと思います。Future
を使って書き直してみましょう。
Await.result
を使って一度値を取り出せば以下のように記述することができますが、一度同期してしまうためイマイチ。PlayやActorで処理を行っているのであれば結果までFuture
で返したいところです。
val result = Seq("rikunabi", "mynavi", "en").map { id =>
Future{
aggregate(id)
}
}.map(Await.result(_, Duration.Inf)).sum
こんな場合はFuture.fold
やFuture.reduce
を使うといいです。これらのメソッドはそれぞれFuture
の結果をfold
、reduce
するFuture
を生成します。
Future.reduce(ids.map { id =>
Future{
aggregate(id)
}
})(_ + _)