【发布时间】:2021-04-20 04:41:57
【问题描述】:
我是 Scala 新手,想知道如何将 Future[Option[A]] 转换为 Future[A]
【问题讨论】:
-
我想这就是你要找的东西stackoverflow.com/a/38226646/14746858
我是 Scala 新手,想知道如何将 Future[Option[A]] 转换为 Future[A]
【问题讨论】:
由于Option[A]可能是None,如果要将其转换为A,最直接的方法是使用.getOrElse(value)方法,其中需要提供@类型的默认值如果选项本身没有,则使用 987654325@。
val opt1 = Some(3)
opt1.getOrElse(5) //returns 3
val opt2 = None
opt2.getOrElse(5) //returns 5
那么,如果你有一个Future[Option[A]],你想在未来的.map 方法中这样做:
val futureOpt: Future[Option[Int]] = Future{ Some(3) }
val future: Future[Int] = futureOpt.map{opt => opt.getOrElse(5)}
【讨论】:
Option[A] 可以是 Some[A] 或 None。 Some[A] 的情况很简单,你可以从中得到 A。但是None 的情况呢,您可以提供默认值,也可以将其视为失败。
使用默认值,
val aDefault: A = ...
val aFuture1 = aOptionFuture.map({
case Some(a) => a
case None => aDefault
})
// or
val aFuture2 = aOptionFuture.map(_.getOrElse(aDefault))
考虑失败,
val aFuture3 = aOptionFuture.flatMap({
case Some(a) => Future.successful(a)
case None=> Future.failed(new Exception("computed a None"))
})
【讨论】:
val optFuture: Future[Option[Int]] = Future(Some(3))
optFuture.map {
case Some(v) => v
case None => throw new RuntimeException("<some-exception>")
}
或者
optFuture.map(_.getOrElse(throw new RuntimeException("<some-exception>")))
【讨论】: