的地图是什么,从斯卡拉,执行期货
Map[String, Future[A]]
去
Map[String, A]
其中A是对应未来的执行结果的最佳方式?
这不会编译:
val results = for {
(key, future) <- myMap
result <- future
} yield (key, result)
,因为我可以在相同的理解不能混用期货和iterables。
的地图是什么,从斯卡拉,执行期货
Map[String, Future[A]]
去
Map[String, A]
其中A是对应未来的执行结果的最佳方式?
这不会编译:
val results = for {
(key, future) <- myMap
result <- future
} yield (key, result)
,因为我可以在相同的理解不能混用期货和iterables。
如果你把它转换成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])(_ + _)
}
然后赎单的未来为正常。
迪马已经给使用Await
答案。但是,如果未来失败,它会引发异常。
您可以将其中的类型进一步包装为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
}
通过上面的调用,您可以自动放弃失败的期货并仅收集成功的期货。
你意识到从Map [String,Future [A]]到'Map [String,A]'你将别无选择,只能阻止?你的情况好吗?否则,我认为你真正想要的是从Map [String,Future [A]]'到'Future [Map [String,A]]' –
@RégisJean-Gilles好评。这[回答](http://stackoverflow.com/questions/17479160/how-to-convert-mapa-futureb-to-futuremapa-b)包含提示也要这样做。 – ticofab