我有一个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)
}
处理这种情况的最优雅的方法是什么?
答案 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
指定类型那样工作,而是变成了模式匹配。