Как выполнить 2 HTTP-запроса асинхронно с использованием современных функций Java 8? - PullRequest
0 голосов
/ 13 июля 2020

Я прихожу из мира JS и пытаюсь понять, как асинхронное программирование работает в современном Java. Я читал, что самые последние большие обновления в этом топе c были сделаны в Java 8, где они представили класс CompletableFuture, но это кажется немного сложным, и я подумал, что будет проще поймите, есть ли у меня какие-то параллели с чем-то, что я уже знаю.

В современном Node.js для асинхронного выполнения 2 функций с асинхронными вызовами (IO, network et c) я бы написал Promise.all(function1(), function2()).

Допустим, я хочу сделать 3 запроса HTTP Get асинхронно, получить результат выполнения и использовать его в некоторой функции с именем consumeResults(). Вот как бы я сделал это в Node.js

async function executeAndDoSomethingWithResults() {
   const request1 = httpGetRequest("url1")
   const request2 = httpGetRequest("url2")
   const request3 = httpGetRequest("url3")
   const results = await Promise.all([request1, request2, request3])
   consumeResults(results)
}

async function httpGetRequest(url) {
   // blablabla
   // wrap the native http module to return a Promise
}

Что было бы альтернативой этому фрагменту кода в Java 8 +?

1 Ответ

1 голос
/ 13 июля 2020

В Java вы можете сделать это, как имитировать c такое же поведение и дизайн

void executeAndDoSomethingWithResults() {

    CompletableFuture<SomeClass> request1 = httpGetRequest("url1");
    CompletableFuture<SomeClass> request2 = httpGetRequest("url2");
    CompletableFuture<SomeClass> request3 = httpGetRequest("url3");

    CompletableFuture.allOf(request1, request2, request3)
                        .thenApply(ignore -> 
                          consumeResults(request1.join(), request2.join(), request3.join())
                        );
}

CompletableFuture<SomeClass> httpGetRequest(final String url) {
    // blablabla
}

Код можно оптимизировать больше.

...