配列の中のFutureを扱いやすくする方法
開発の中で「配列の中の値がFutureで包まれていて思うように扱えない。」そんな経験はありませんか?
自分はこの問題にあたりFutureの便利メソッドの存在を知ったので、今回はその知見を残せたらと思います。
Future.sequence
コレクションの操作をしている中で戻り値が Seq[Future[Hoge]]
になった際にはFuture.sequenceを使用するとfor式で簡単に扱える形に変換することができる。
発生した問題
for式の中で、コレクションをmapして中の値一つ一つがDBとのやりとりを行いFuture型を戻り値にする場合には型がSeq[Future[Hoge]]になり非常に扱いづらい。
for {
seqFutureInt <- Seq(1,2,3).map( int => Future.succcessful(int))
//この後に処理を書きにくい
} ....
解決策:Future.sequenceを使用する
このメソッドを使用すると
Seq[Future[Hoge]]
を
Future[Seq[Hoge]]
に変換することができる。
この型にすればfor式で続きの処理も書きやすい。
for {
seqFutureInt: Seq[Future[Int] = Seq(1,2,3).map( int => Future.successfull(int))
seqInt: Seq[Int] <- Future.sequence(seqFutureInt)
seqIntDouble: Seq[Int] <- seqInt.map( int => int * 2) //中の要素を2倍にする
} yield seqIntDouble
使用に際して
Future.sequenceの引数には Seq[Future[Hoge]]
を渡す。
Futureを使用するにはFutureのimportが必要になるので注意。
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global // 必要なら
良いFutureライフを!