Lesson 9 / 38
CompletableFuture
Compose non-blocking asynchronous pipelines with thenApply, thenCompose and thenCombine, and recover from failures using exceptionally and handle.
Chain, combine, handle
thenApply transforms a result, thenCompose flat-maps another async call, thenCombine joins two, exceptionally / handle recover from failure — all without blocking.
CompletableFuture
.supplyAsync(() -> fetchUser(id), pool)
.thenCompose(u -> loadOrdersAsync(u))
.thenApply(this::summarise)
.exceptionally(ex -> Summary.empty())
.thenAccept(System.out::println);Async variants and combining many
thenApply runs its continuation on whichever thread completed the future (could be the caller!); thenApplyAsync(fn, pool) guarantees it runs on your pool. CompletableFuture.allOf(...) waits for every future; anyOf(...) waits for the first to finish.