在 completablefuture 中使用函数式接口,核心是调用 whencomplete 方法并传入一个实现 biconsumer 接口的 lambda 表达式。该接口接收两个参数:计算结果和可能出现的异常,通过这两个参数即可对异步任务的完成状态进行统一处理。

如何获取正常执行的结果值
当任务成功完成时,BiConsumer 的第一个参数 T result 即为最终的计算结果,第二个参数 Throwable ex 为 null。开发者可以直接使用这个结果值进行后续操作,例如打印日志或更新 UI。

import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> "Success");
future.whenComplete((result, ex) -> {
if (ex == null) {
System.out.println("Result: " + result);
}
});
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}</string>
如何处理执行过程中抛出的异常
如果异步任务在执行期间抛出异常,BiConsumer 的 result 参数将为 null,而 ex 参数将包含具体的异常对象。此时可以通过判断 ex != null 来捕获错误并进行恢复或记录。

import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Error");
});
future.whenComplete((result, ex) -> {
if (ex != null) {
System.out.println("Exception: " + ex.getMessage());
}
});
try { Thread.sleep(1000); } catch (InterruptedException e) {}
}
}</string>
whenComplete 是否会改变原始 Future 的完成状态
whenComplete 不会改变原始 CompletableFuture 的完成状态。无论回调中是否抛出新的异常,原始 future 都会保持其原有的完成结果(成功或失败)。如果需要基于当前结果生成一个新的 CompletableFuture,应使用 thenApply 或 handle 等方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











