Phase 19 of 20 · Topic 19.2

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.