3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

scala 配列の中のFutureを扱いやすくする方法

Posted at

配列の中の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ライフを!

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?