// Created on savesnippets.com · https://savesnippets.com/Zon9eqlEFs78bB import java.net.URI; import java.net.http.*; import java.util.*; import java.util.concurrent.*; class Demo { static final HttpClient client = HttpClient.newHttpClient(); CompletableFuture fetchAsync(String url) { var req = HttpRequest.newBuilder(URI.create(url)).GET().build(); return client .sendAsync(req, HttpResponse.BodyHandlers.ofString()) .thenApply(HttpResponse::body); } public static void main(String[] args) { var urls = List.of("https://example.com", "https://example.org", "https://example.net"); // Fire all concurrently, collect results in order var futures = urls.stream() .map(new Demo()::fetchAsync) .toList(); // Wait for all — allOf returns CF, so flatten manually CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); for (int i = 0; i < urls.size(); i++) { System.out.println(urls.get(i) + " → " + futures.get(i).join().length() + " bytes"); } } }