Преобразовать Java CompletionStage в Scala эквивалент - PullRequest
2 голосов
/ 27 мая 2020

Я пытаюсь преобразовать приведенный ниже код java в его scala эквивалент

CompletionStage<GetXByKeyResponse> apiResponseF = appleClient.getAppleProperty(key);

CompletionStage<XContainer> xContainerF = apiResponseF.thenCompose(resp -> resp.fold(
    CompletableFuture::completedFuture,
    errorNotFound -> Futures.failedFuture(new Exception("some error")),
    errorInternalServerError -> Futures.failedFuture(new Exception("some error"))
    ));

return xContainerF;

В Scala, я преобразовал CompletionStage в Scala Future и мне нужна помощь с функцией fold . Приведенное ниже преобразование выглядит хорошо, и это правильный способ извлечь XContainer из futureResponse?

    val apiResponseF: CompletionStage[GetXByKeyResponse] = appleClient.getAppleProperty(key)

    val futureResponse: Future[GetXByKeyResponse] = scala.compat.java8.FutureConverters.toScala(apiResponseF)

    futureResponse.onSuccess(resp => resp.fold(???, ???, ???))

Определение метода fold:

import java.util.function.Function;

    public <T> T fold(Function<XContainer, T> handleOk,
                Function<ServiceErrorResponse, T> handleNotFound,
                Function<ServiceErrorResponse, T> handleInternalServerError) {
            if (this instanceof Ok) {
                return handleOk.apply(((Ok) this).getValue());
            } else if (this instanceof NotFound) {
                return handleNotFound.apply(((NotFound) this).getValue());
            } else if (this instanceof InternalServerError) {
                return handleInternalServerError.apply(((InternalServerError) this).getValue());
            } else {
                throw new AssertionError("This is a bug!");
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...