Scala对Future [Option]的理解无一例外

时间:2018-12-27 12:05:38

标签: scala optional future for-comprehension

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

我试图用于理解(以及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)
}

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

2 个答案:

答案 0 :(得分:0)

尝试

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)

答案 1 :(得分:0)

getOptionResult.recover { case _ => None }

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

通常,您不想在<-的左侧指定类型,它根本不像为val/var/def指定类型那样工作,而是变成了模式匹配。