簡體   English   中英

Scala Future的優雅處理[任何一個]

[英]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)

或者,如果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) => ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM