如何使用现代 Java 8 功能异步发出 2 个 HTTP 请求?

How to make 2 HTTP requests asynchronously using modern Java 8 features?

我来自 JS 世界,并试图了解异步编程在现代 Java 中的工作原理。我读到该主题的最新重大更新是在 Java 8 中进行的,他们在其中引入了 CompletableFuture class 但它似乎有点复杂,我认为它会更容易理解如果我与我已经知道的东西有一些相似之处。

在现代 Node.js 中,为了通过异步调用(IO、网络等)异步执行 2 个函数,我会写 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+ 中这段代码的替代方案是什么?

在Java中,您可以模仿相同的行为和设计

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
}

代码可以进一步优化