Scala Future的优雅处理[Either]]

spa*_*rkr 1 scala either

我有一个形状如下的类型:

val myType: Future[Either[MyError, TypeA]] = // some value
Run Code Online (Sandbox Code Playgroud)

我知道我可以在此模式匹配并转到Right或Left类型,但问题是我必须嵌套我的模式匹配逻辑.我正在寻找更优雅的处理方式吗?有什么建议?

Arn*_*sen 6

如果您MyError将异常编码为异常,则不再需要它Either,并且可以简单地对完成进行模式匹配,或使用a recoverWith将其映射到另一种类型:

myType.onComplete {
  case Success(t) =>
  case Failure(e) =>
}
Run Code Online (Sandbox Code Playgroud)

要映射现有Either类型,您可以执行以下操作:

case class MyException(e: MyError) extends Exception

def eitherToException[A](f: Future[Either[MyError,A]]): Future[A] = {
  f.flatMap {
    case Left(e) => Future.failed(MyException(e))
    case Right(x) => Future.successful(x)
  }
}

val myType2 = eitherToException(myType)
Run Code Online (Sandbox Code Playgroud)

或者,如果MyError并且TypeA在您的控制之下,您可以创建一个共同的超类型和模式匹配:

sealed trait MyResult
final case class MyError() extends MyResult
final case class TypeA() extends MyResult

myType.map {
  case MyError() => ...
  case TypeA() => ...
}
Run Code Online (Sandbox Code Playgroud)