Skip to content

Instantly share code, notes, and snippets.

@takezoe
Created January 31, 2015 15:23
Show Gist options
  • Save takezoe/cff6140eaf13e12586e6 to your computer and use it in GitHub Desktop.
Save takezoe/cff6140eaf13e12586e6 to your computer and use it in GitHub Desktop.
Futureの練習問題です

Futureの結果を集計する

以下のような集計処理を行うメソッドがあるとします。

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.foldFuture.reduceを使うといいです。これらのメソッドはそれぞれFutureの結果をfoldreduceするFutureを生成します。

Future.reduce(ids.map { id =>
  Future{
    aggregate(id)
  }
})(_ + _)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment