Como obtenho um CompletableFuture <T> de uma solicitação do cliente HTTP assíncrono?

EmDocumentação do cliente assíncrono Http Eu vejo como conseguir umFuture<Response> como resultado de uma solicitação HTTP Get assíncrona, basta fazer, por exemplo:

AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
Future<Response> f = asyncHttpClient
      .prepareGet("http://api.football-data.org/v1/soccerseasons/398")
      .execute();
Response r = f.get();

No entanto, por conveniência, gostaria de obter umaCompletableFuture<T> em vez disso, para o qual eu poderia aplicar uma continuação que converte o resultado em outra coisa, por exemplo, desserializando o conteúdo da resposta do Json em um objeto Java (por exemplo,SoccerSeason.java) Isto é o que eu gostaria de fazer:

AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient();
CompletableFuture<Response> f = asyncHttpClient
     .prepareGet("http://api.football-data.org/v1/soccerseasons/398")
     .execute();
f
     .thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class))
     .thenAccept(System.out::println);

De acordo comDocumentação do cliente assíncrono Http a única maneira de fazer isso é através de umAsyncCompletionHandler<T> objeto e usando uma promessa. Então eu construí ummétodo auxiliar para esse fim:

CompletableFuture<Response> getDataAsync(String path){
    CompletableFuture<Response> promise = new CompletableFuture<>();
    asyncHttpClient
            .prepareGet(path)
            .execute(new AsyncCompletionHandler<Response>() {
                @Override
                public Response onCompleted(Response response) throws Exception {
                    promise.complete(response);
                    return response;
                }
                @Override
                public void onThrowable(Throwable t) {
                    promise.completeExceptionally(t);
                }
            });
    return promise;
}

Com este método utilitário, posso reescrever o exemplo anterior, fazendo o seguinte:

getDataAsync("http://api.football-data.org/v1/soccerseasons/398")
    .thenApply(r -> gson.fromJson(r.getResponseBody(), SoccerSeason.class))
    .thenAccept(System.out::println);

Existe alguma maneira melhor de obter umCompletableFuture<T> de uma solicitação do cliente HTTP assíncrono?

questionAnswers(1)

yourAnswerToTheQuestion