在 completionstage 的 thenacceptboth 方法中,可以直接传入一个实现了 biconsumer 接口的 lambda 表达式。该方法的签名要求接收两个参数(分别代表当前阶段和另一个阶段的完成结果)并返回 void,因此只需编写形如 (result1, result2) -> { ... } 的代码块即可。

如何定义并传递 BiConsumer 参数
直接回答:将两个异步任务的返回值作为参数传递给 BiConsumer 的 Lambda 表达式。

import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
// thenAcceptBoth 接收另一个 CompletionStage 和一个 BiConsumer
future1.thenAcceptBoth(future2, (res1, res2) -> {
System.out.println(res1 + " " + res2);
});
// 保持主线程存活以观察输出
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}如何处理任务执行中的异常
直接回答:thenAcceptBoth 本身不处理异常,若任一前置任务抛出异常,回调函数不会执行;需配合 exceptionally 或 handle 进行容错。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;

import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Success");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Error in stage 2");
});
future1
.thenAcceptBoth(future2, (res1, res2) -> {
System.out.println(res1 + " " + res2);
})
.exceptionally(ex -> {
System.out.println("Caught exception: " + ex.getMessage());
return null;
});
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}基于输入结果的类型推断问题
直接回答:当两个 CompletionStage 的泛型类型不一致时,BiConsumer 的参数类型会自动匹配对应的泛型类型,无需手动强制转换。

















