[英]Elegant Handling of Scala Future[Either]]
我有一个形状如下的类型:
val myType: Future[Either[MyError, TypeA]] = // some value
我知道我可以对此进行模式匹配并获得Right或Left类型,但是问题是我必须嵌套我的模式匹配逻辑。 我正在寻找更优雅的方式来处理此问题? 有什么建议么?
如果将MyError
编码为异常,则不再需要Either
,而只需针对完成情况进行recoverWith
,或使用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)
或者,如果MyError
和TypeA
在您的控制之下,则可以创建一个通用的超级类型和模式匹配项:
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) => ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.