我的功能如下:
Complex
正如您所看到的,如果Future失败,那么它将触发恢复体内的部分函数。这将返回Left并满足Either类型的左侧部分。我坚持的是如果Goo未来成功完成,如何返回Right。
我尝试了以下内容:
def bar(x : Int) : Either[String, Future[Option[Foo]]] = {
Goo() recover { case e => Left("Some error string") }
}
但是,我收到类型错误,指出def bar(x : Int) : Either[String, Future[Option[Foo]]] = {
Goo().map(x => Right(Future.successful(x))) recover { case e => Left("Some error string") }
}
的返回类型为bar
。
如何返回Future[Either[String, Future[Foo]]]
Right(x)
x
类型的某些值?
更新
Foo
答案 0 :(得分:0)
您没有定义Goo
,但我现在假设以下内容:
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
case class Foo(n: Int)
/** Takes a string and returns a future int-parsing of it */
def Goo(s: String): Future[Foo] = Future {
Foo(java.lang.Integer.parseInt(s)) // will throw an exception on non-int
}
然后,如果您希望bar(s: String)
返回Either[String, Option[Foo]]
Option
为Some[Foo]
,如果该号码可解析且为正,或None
如果可解析但非正面,String
解释了为什么它无法解析,你可以这样做:
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import scala.util.control.NonFatal
def bar(s: String): Future[Either[String, Option[Foo]]] = {
Goo(s).map { foo: Foo =>
Right(if (foo.n > 0) Some(foo) else None)
}.recover {
case NonFatal(e) => Left("Failed to parse %s: %s".format(s, e))
}
}
瞧:
scala> Await.result(bar("4"), Duration.Inf)
res1: Either[String,Option[Foo]] = Right(Some(Foo(4)))
scala> Await.result(bar("-4"), Duration.Inf)
res2: Either[String,Option[Foo]] = Right(None)
scala> Await.result(bar("four"), Duration.Inf)
res3: Either[String,Option[Foo]] = Left(Failed to parse four: java.lang.NumberFormatException: For input string: "four")