Scala,执行期货地图
Scala, execute map of futures
从
出发的最佳方式是什么
Map[String, Future[A]]
到
Map[String, A]
其中 A 是相应 future 的执行结果?
这不会编译:
val results = for {
(key, future) <- myMap
result <- future
} yield (key, result)
因为我不能为了理解而将 futures 和 iterables 混合在一起。
也许是这样的:
map.mapValues { Await.result(_, 5 seconds) }
Dima 已经使用 Await
给出了答案。然而,当 Future 失败时它会引发异常。
您可以进一步将类型包装为 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
}
通过上面的调用,您会自动丢弃失败的期货,只收集成功的期货。
如果将其转换为 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])(_ + _)
}
然后照常赎回单一期货。
从
出发的最佳方式是什么Map[String, Future[A]]
到
Map[String, A]
其中 A 是相应 future 的执行结果?
这不会编译:
val results = for {
(key, future) <- myMap
result <- future
} yield (key, result)
因为我不能为了理解而将 futures 和 iterables 混合在一起。
也许是这样的:
map.mapValues { Await.result(_, 5 seconds) }
Dima 已经使用 Await
给出了答案。然而,当 Future 失败时它会引发异常。
您可以进一步将类型包装为 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
}
通过上面的调用,您会自动丢弃失败的期货,只收集成功的期货。
如果将其转换为 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])(_ + _)
}
然后照常赎回单一期货。