Scala未来的优雅处理[任一]]



我有一个类型,它的形状是这样的:

val myType: Future[Either[MyError, TypeA]] = // some value

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

如果您将MyError编码为异常,则不再需要Either,可以简单地对补全进行patternMatch,或使用recoverWith将其映射为另一种类型:

myType.onComplete {
  case Success(t) =>
  case Failure(e) =>
}

要映射您现有的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)

或者,如果MyErrorTypeA在您的控制之下,您可以创建一个通用的超类型和模式匹配:

sealed trait MyResult
final case class MyError() extends MyResult
final case class TypeA() extends MyResult
myType.map {
  case MyError() => ...
  case TypeA() => ...
}

您可以创建自定义提取器对象:

object FullSuccess {
  def unapply[T](x: Try[Either[MyError, T]]) = x match {
    case Success(Right(x)) => Some(x)
    case _ => None
  }
}
object PartSuccess {
  def unapply[T](x: Try[Either[MyError, T]]) = x match {
    case Success(Left(err)) => Some(err)
    case _ => None
  }
}

val myType: Future[Either[MyError, TypeA]] = // some value
myType.onComplete {
  case FullSuccess(x) => ... // equivalent to case Success(Right(x))
  case PartSuccess(x) => ... // equivalent to case Success(Left(x))
  case Failure(e) => ...
}

最新更新