Scala,执行期货地图

时间:2016-03-23 15:53:39

标签: scala dictionary future for-comprehension

开始的最佳方式是什么?
Map[String, Future[A]]

Map[String, A]

其中A是相应未来执行的结果?

这不会编译:

val results = for {
  (key, future) <- myMap
  result <- future
} yield (key, result)

因为我无法将期货和可迭代品混合在一起以便理解。

3 个答案:

答案 0 :(得分:2)

如果您将其转换为Seq[Future[(String,A)]],则可以使用Future.fold将其转回单Future[Map[...]]

def transform[A](m: Map[String, Future[A]]): Future[Map[String, A]] = {
  val seq: Seq[Future[(String, A)]] = m.toSeq.map { case (key, f) =>
    f.map(i => key -> i)
  }

  Future.fold(seq)(Map.empty[String, A])(_ + _)
}

然后正常兑换单个未来。

答案 1 :(得分:0)

或许这样的事情:

 map.mapValues { Await.result(_, 5 seconds) }

答案 2 :(得分:-1)

Dima已经使用Await给出了答案。但是,当Future失败时,它会引发异常。

您可以进一步将类型包装为Try,然后执行.collect仅过滤成功的期货(查看官方API)。

import scala.util.{ Try, Success }

val results = myMap
    .map {
        case (key, value) => key => Try(Await.result(value, 5.seconds))
    }
    .collect {
        case (key, Success(value)) => key -> value
    }

通过上述调用,您会自动丢弃未通过的期货,只收集成功的期货。