Как любезно объединить результаты двух Either's - PullRequest
1 голос
/ 04 марта 2020

У меня есть функция, в которой мне нужно объединить результаты из двух объектов Either.

Мне нужна правая часть «запроса», если «processingResult» - Право, и это факт, что если «processingResult» - это Right, «request» - также Right.

Если «processingResult» - это Left, мне нужно его значение для построения ответа.

Прямо сейчас это реализация ( и FailingResponse, и SuccessfulResponse расширяют ValuationResponse):

def getResponse(handlingResult : Either[FailureReason, List[StockValuation]]
               ,request        : Either[Error, ValuationRequest]
               ): ValuationResponse = {

  handlingResult.fold(
      failureReason =>
          FailingResponse(failureReason.message
                         ,failureReason.statusCode),
      listOfValuations =>
          SuccessfulResponse(listOfValuations
                            ,request.right.get.symbol
                            ,request.right.get.function
                            ,StatusCodes.SUCCESS))
}

Но я подозреваю, что прямой доступ к любому из них не является хорошей практикой, например, в

request.right.get.symbol

Что может быть хорошим способом для достижения того же поведения, но рекомендуемым способом?

1 Ответ

3 голосов
/ 04 марта 2020

Либо смещено вправо в Scala 2.12 и выше, поэтому вы можете использовать для понимания

  def getResponse(handlingResult : Either[FailureReason, List[StockValuation]]
                  ,request        : Either[Error, ValuationRequest]
                 ): ValuationResponse = {
    val result = for {
      result <- handlingResult
      req <- request
    } yield {
      SuccessfulResponse(result, req.symbol, req.function, SUCCESS)
    }
    result match {
      case Right(resp) => resp
      case Left(FailureReason(msg, code)) => FailingResponse(msg, code)
      case Left(Error) => FailingResponse("failed for unknown reasons", SOME_NEW_CODE)
    }
  }

Обратите внимание, что, хотя вы и не ожидаете, что последний оператор case когда-либо совпадет , он должен быть там для полноты, и можно сделать новый код SOME_NEW_CODE, чтобы указать, что произошло что-то неожиданное.

...