知识卡片
Compose避免嵌套
内容
thenCompose 适合第二步本身也是异步任务的场景:要求第二个任务返回值必须是 CompletionStage(用 supplyAsync() 包装),并把这层展平返回,不像 thenApply 那样会得到嵌套的 CompletableFuture<CompletableFuture<T>>。它表达”前一步结果决定下一段完整异步流程”,见 [[串行依赖选方法]]。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第10章《CompletableFuture异步回调》10.2.4节《thenCompose()方法》(源文件:_epub-src/OEBPS/Text/chapter310.xhtml)
- 结论依据:原文说明“thenCompose()方法要求第二个任务的返回值是一个CompletionStage异步实例。因此,可以调用CompletableFuture.supplyAsync()方法将第二个任务所要调用的普通异步方法包装成一个CompletionStage异步实例”,并通过分两步计算(10+10)*2的示例证明thenCompose返回的“不是第二个任务所要执行的普通异步方法……的直接计算结果,而是……包装成一个CompletionStage异步实例并返回”,因此推出本卡结论。
- 原始内容:thenCompose()方法要求第二个任务的返回值是一个CompletionStage异步实例……thenCompose()所返回的不是第二个任务所要执行的普通异步方法Supplier<Long>.get()的直接计算结果,而是调用CompletableFuture.supplyAsync()方法将普通异步方法……包装成一个CompletionStage异步实例并返回。