的地圖是什麼,從斯卡拉,執行期貨
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