【问题标题】:Future[Try[Option[Int]]] giving error found : models.TenantGlobalBranding [error] required: scala.concurrent.Future[?]Future[Try[Option[Int]]] 给出错误发现:models.TenantGlobalBranding [error] required: scala.concurrent.Future[?]
【发布时间】:2017-09-20 17:46:54
【问题描述】:
我有一个 Int:Future[Try[Option[Int]]] ,我需要该 Int 值。我有这样的代码:
def fun(number: Future[Try[Option[Int]]]): Future[Result] = {
val num: Int = number.flatMap(x => processTry(x))
}
def processTry(x: Try[Option[Int]]): Int = processOption(x.getOrElse(Some(101)))
def processOption(x: Option[Int]): Int = x.getOrElse(101)
我收到此错误required: scala.concurrent.Future[?]
【问题讨论】:
标签:
scala
playframework
future
【解决方案1】:
您可以利用模式匹配非常干净地处理答案和错误案例:
val result: Future[Try[Option[Int]]]
result.onComplete {
case Success(Success(Some(i))) => // you get your i: Int
case Success(Success(None)) => // you get None
case _ => // Either the `Future` or the `Try` failed, you could also process both cases separately
}
【解决方案2】:
- 您的
number.flatMap 要求 lambda 返回 Future[Int]。而processTry 被定义为: Int。您可以将flatMap 替换为map。
- 您已将
num 定义为Int,而fun 的结果是Future[Result]。你错过了一些代码吗?
-
val num = ... 的类型为 Unit,它与函数类型不同。
代码可能看起来像
def fun(number: Future[Try[Option[Int]]]): Future[Result] = {
val num: Future[Int] = number.map(x => processTry(x))
num.map{i => Result(i)}
}