CompletableFuture: Asynchronous Reactive Pipelines
1Concept
`CompletableFuture` enables non-blocking, asynchronous reactive programming in Java. It allows chaining stages (`thenApply`, `thenCompose`), combining concurrent asynchronous tasks (`thenCombine`, `allOf`), and handling exceptions gracefully (`exceptionally`, `handle`) without thread blocking.
2Architecture Diagram
Task A (Fetch User) ----
\---> [ thenCombine() ] ---> Process final checkout!
Task B (Fetch Inventory) ---/3Code Example
Core Java
import java.util.concurrent.CompletableFuture;
public class CompletableFutureDemo {
public static void main(String[] args) {
// Async Task 1: Fetch user profile
CompletableFuture<String> userTask = CompletableFuture.supplyAsync(() -> {
return "User[Alice]";
});
// Async Task 2: Fetch account balance
CompletableFuture<Double> balanceTask = CompletableFuture.supplyAsync(() -> {
return 4500.00;
});
// Asynchronously combine both results
CompletableFuture<String> combined = userTask.thenCombine(balanceTask, (user, balance) -> {
return user + " has verified balance: $" + balance;
});
System.out.println("Result: " + combined.join());
}
}4Expected Output
Result: User[Alice] has verified balance: $4500.0
5Key Takeaways
- ✓Use `.join()` instead of `.get()` to avoid checked exception boilerplate.
- ✓`thenApply` transforms synchronous results; `thenCompose` chains dependent async stages (flattens nested futures).
- ✓`CompletableFuture.allOf()` coordinates completion across multiple independent parallel requests.