Java CompletableFuture 中 thenApply thenAccept thenRun 有什么区别
这三个方法的核心区别在于输入输出类型和是否消费结果:thenapply 接收上游结果并返回新值,用于转换;thenaccept 接收上游结果但不返回值,用于副作用操作;thenrun 不接收任何参数也不返回值,仅在上游完成时执行。它们分别对应 function、consumer 和 runnable 函数式接口。

thenApply 如何转换数据并传递结果
thenApply 用于将上游计算的结果转换为另一种类型或格式,并将转换后的结果传递给后续的 Stage。它接受一个 Function 作为参数,其中 T 是上游的完成值,R 是新的完成值。如果上游异常,则直接传播异常,不会调用转换器。返回值是一个新的 CompletableFuture,其状态取决于转换函数的执行结果。

import java.util.concurrent.CompletableFuture;
public class ThenApplyExample {
public static void main(String[] args) throws Exception {
// 模拟一个异步任务,返回字符串 "Hello"
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> "Hello");
// 使用 thenApply 将字符串转换为大写
CompletableFuture<string> resultFuture = future.thenApply(s -> s.toUpperCase());
// 获取最终结果
String result = resultFuture.get();
System.out.println("Result: " + result); // 输出: Result: HELLO
}
}</string></string>
thenAccept 和 thenRun 如何处理无返回值的操作
thenAccept 用于处理上游的结果,但不对结果进行转换,也不返回任何值(返回 void)。它接受一个 Consumer,通常用于日志记录、数据库写入等副作用操作。而 thenRun 完全不关心上游的结果是什么,甚至不关心上游是否成功(除非抛出异常),它只关注“上游任务已完成”这一事实。它接受一个 Runnable,常用于清理资源或触发后续无关数据的流程。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

import java.util.concurrent.CompletableFuture;
public class ThenAcceptAndRunExample {
public static void main(String[] args) throws Exception {
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> "Data");
// thenAccept: 消费结果,无返回值
CompletableFuture<void> acceptFuture = future.thenAccept(data -> {
System.out.println("Consumed: " + data);
});
// thenRun: 忽略结果,仅执行动作
CompletableFuture<void> runFuture = future.thenRun(() -> {
System.out.println("Task completed, running cleanup.");
});
// 等待所有完成
acceptFuture.join();
runFuture.join();
}
}</void></void></string>
当上游任务抛出异常时,这三个方法的行为有何不同
当上游任务抛出异常时,thenApply 和 thenAccept 都不会执行其内部的回调函数,而是直接将异常传播到返回的新 CompletableFuture 中。这意味着如果你没有通过 exceptionally 或 handle 捕获异常,调用 get() 时会抛出 ExecutionException。相比之下,thenRun 的行为略有不同:如果上游正常完成,它执行;如果上游因异常完成,thenRun 依然会执行其回调函数,因为它只关心“完成”事件,而不关心结果是值还是异常。这使得 thenRun 适合用于无论成功与否都需要执行的清理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










