CompletableFuture Composition
What common mistakes do candidates make around CompletableFuture Composition, and how do you avoid them?
Answers use simple, clear English.
Quick interview answer
Common mistakes: Blocking get() on async chain in request thread; lost exceptions without handle. Best practices: Specify executor for IO; use orTimeout/join with timeout in Java 9+.
Detailed answer
Common mistakes: Blocking get() on async chain in request thread; lost exceptions without handle. Best practices: Specify executor for IO; use orTimeout/join with timeout in Java 9+. Core: supplyAsync runs async task; thenApply transforms; thenCompose flattens nested futures; allOf waits for batch. Exceptionally/handle for error paths. Real-time example: Aggregate microservice responses: CompletableFuture.allOf(userF, ordersF).thenApply(...). Pros: Composable async without raw callbacks; integrates with thread pools. Cons: Default ForkJoinPool.commonPool() shared — inject Executor for isolation. Common mistakes: Blocking get() on async chain in request thread; lost exceptions without handle. Best practices: Specify executor for IO; use orTimeout/join with timeout in Java 9+. Audience level: Tech Lead.
Full explanation
supplyAsync runs async task; thenApply transforms; thenCompose flattens nested futures; allOf waits for batch. Exceptionally/handle for error paths.
Real example & use case
Aggregate microservice responses: CompletableFuture.allOf(userF, ordersF).thenApply(...).
Pros & cons
Pros: Composable async without raw callbacks; integrates with thread pools. Cons: Default ForkJoinPool.commonPool() shared — inject Executor for isolation.
Common mistakes
Blocking get() on async chain in request thread; lost exceptions without handle.
Best practices
Specify executor for IO; use orTimeout/join with timeout in Java 9+.
Follow-up questions
Open one as its own read / solve / listen card