【问题标题】:Scala's for comprehensions with Future[Option] with no exceptionsScala 对 Future[Option] 的理解没有例外
【发布时间】:2019-05-25 11:14:27
【问题描述】:

我有一个 Future[Option[String]] 函数。仅当未来成功且字符串存在时,我才需要获取转换后的字符串。在其他情况下,我只需要得到一个 None (没有任何错误或异常)

我尝试使用 for comprehensions(以及 maps/flatMaps),但显然我的结果是键入 Nothing 而不是 Option[String]。

def getOption: Option[String]
def getOptionResult: Future[Option[String]]
def someActions: String

val resultO: Option[String] = for {
  myString: String <- getOption
  optionResult: Option[String] <- getOptionResult
  result: String <- optionResult
} yield {
  someActions(result)
}

处理这种情况最优雅的方法是什么?

【问题讨论】:

  • 在您的示例代码中,myString 的用途是什么? someActions()的返回类型是什么?

标签: scala optional future for-comprehension


【解决方案1】:

试试这个

import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits.global

 def getOptionResult: Future[Option[String]] = Future(Some("Foo"))
 //    def getOptionResult: Future[Option[String]] = Future(None)

val d = getOptionResult.map(a => a.map(r => "(" + r + ")"))

val res = Await.result(d, 100 nanos).getOrElse(None)

【讨论】:

  • 结果不会是 String 而是 io.Serializable
【解决方案2】:
getOptionResult.recover { case _ => None }

如果我正确理解了您的要求。这将提供一个永远成功的未来,如果成功,则与 getOptionResult 和失败时 None 具有相同的结果。见the docs

一般你不想在&lt;-的左边指定类型,它根本不像为val/var/def指定它们,而是变成模式匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-02
    • 2015-10-09
    • 2013-02-15
    • 2016-11-08
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多