これはコンパイルされません。
val results = for {
(key, future) <- myMap
result <- future
} yield (key, result)
私は理解のために同じで先物や反復可能オブジェクトを混在させることはできませんよう。おそらく、このような
これはコンパイルされません。
val results = for {
(key, future) <- myMap
result <- future
} yield (key, result)
私は理解のために同じで先物や反復可能オブジェクトを混在させることはできませんよう。おそらく、このような
あなたはSeq[Future[(String,A)]]
に変換する場合は、その後、単一Future[Map[...]]
それを取り戻すためにFuture.fold
を使用することができます。
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
を実行して、正常なFuturesのみをフィルタリングすることができます(公式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