Я пытаюсь преобразовать приведенный ниже код 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!");
}
}