【问题标题】:How to convert Future[Option[A]] to Future[A]如何将 Future[Option[A]] 转换为 Future[A]
【发布时间】:2021-04-20 04:41:57
【问题描述】:

我是 Scala 新手,想知道如何将 Future[Option[A]] 转换为 Future[A]

【问题讨论】:

标签: scala future


【解决方案1】:

由于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)}

【讨论】:

    【解决方案2】:

    Option[A] 可以是 Some[A]NoneSome[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"))
    })
    

    【讨论】:

      【解决方案3】:
      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>")))
      

      【讨论】:

        猜你喜欢
        • 2020-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 2013-07-02
        • 2012-12-19
        • 2018-11-12
        相关资源
        最近更新 更多