以下のような集計処理を行うメソッドがあるとします。
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)
}
})(_ + _)