Home Ask Login Register

Developers Planet

Your answer is one click away!

Nathan February 2016

Transforming Seq[(A, Future[B])] into a Future[Map[A,B]] in Scala

I'm looking for a clean way to transform a Seq[(A, Future[B])] into a Future[Map[A,B]]. Is there a good way to do this? Thanks in advance!


melps February 2016

If you're allowed scalaz then yes:

val original:Seq[(String,Future[Int])] = Seq("a" -> Future.successful(1))
val transformed:Future[Map[String,Int]] = original.toMap.sequenceU

dth February 2016

You can transform Futures using map and flatMap. Using that, you can just start with an Future computing the empty map and the use flatMap and map to aggregate the other futures:

val s = Seq("A" -> Future {1}, "B" -> Future {2})
val m = s.foldLeft(Future.successful(Map[String,Int]())){
  case (result, (key, future)) => result.flatMap{
    map => future.map{
      value => map + (key -> value)

corn_dog February 2016


val s = Seq( ("1", f1), ("2", f2) )
Future.sequence( s.map { case (k ,v) => v.map(fv => (k ,fv)) } ).map(_.toMap)

Dima February 2016

This is not hard. You need three steps:

 //1. create a list of future tuples
 val futureTuples = Future.map { case (a, futureB) => futureB.map ( a -> _ }
 //2. Transorm it to a future list
 val futureList = Future.sequence(futureTuples)
 //3. Finally, convert list to map:
 val futureMap = futureList.map { _.toMap }

Post Status

Asked in February 2016
Viewed 2,393 times
Voted 7
Answered 4 times


Leave an answer

Quote of the day: live life