thenapply用于转换结果并返回新completablefuture,适合链式异步处理;thenaccept用于消费结果、不返回值,返回completablefuture,适合日志、通知等副作用操作。

thenApply 用于对异步结果做转换并返回新的 CompletableFuture,thenAccept 用于消费结果、不返回新 Future(常用于“只处理,不传递”场景)。
thenApply:转换结果并链式传递
它接收一个函数(Function<t u></t>),把上一个 CompletableFuture 的结果作为输入,返回一个新的 CompletableFuture<u></u>。适合需要把结果加工后继续参与后续异步流程的场景。
- 签名:
<u> CompletableFuture<u> thenApply(Function super T,? extends U> fn)</u></u> - 执行时机:前一个任务完成且**非异常完成**时才调用
- 若前一个 Future 被取消或抛出异常,该函数不会执行,异常会向下传递
- 例子:把字符串长度转为整数,并继续用这个数字做下一步计算
CompletableFuture
// lengthFuture 结果是 5,可继续 .thenApply(i -> i * 2) 等
thenAccept:只消费,不产生新 Future
它接收一个消费者(Consumer<t></t>),对结果执行副作用操作(如打印、存库、发通知),但不返回任何值,也不影响链式流程的类型——返回的是 CompletableFuture<void></void>(实际是空完成的 Future)。
- 签名:
CompletableFuture<void> thenAccept(Consumer super T> action)</void> - 适合日志记录、更新 UI、触发事件等“终点式”处理
- 不能直接接在它后面用
.thenApply(...),因为返回的是CompletableFuture<void></void>,没有值可传 - 如果想继续链式处理,得改用
thenApply或thenCompose
// 返回 CompletableFuture
关键区别总结
-
返回值不同:thenApply 返回带新结果的 CompletableFuture;thenAccept 返回无结果的 CompletableFuture
- 用途定位不同:thenApply 是“映射”,强调数据流转;thenAccept 是“消费”,强调副作用执行
- 链式能力不同:thenApply 可无缝衔接后续异步操作;thenAccept 后若需继续处理原始结果,应前置或换用 thenApply
-
异常传播一致:两者都不捕获上游异常,异常会跳过当前阶段,由后续
exceptionally或handle处理
小提醒:别混淆 thenAccept 和 thenAcceptAsync
两者都只消费不返回,区别在于执行线程:
— thenAccept 默认在前一个任务完成的**同一线程**中执行(可能阻塞);
— thenAcceptAsync 提交到 ForkJoinPool.commonPool()(或指定 Executor),更安全,推荐在有耗时操作时使用。
future.thenAcceptAsync(System.out::println); // 推荐,解耦执行线程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











