在 completablefuture 中使用函数式接口,核心是向 thenaccept 方法传递一个符合 java.util.function.consumer 接口的 lambda 表达式或方法引用。由于 thenaccept 专门用于处理异步任务完成后的副作用(即不返回新值),你只需定义一个接受单个参数且无返回值的逻辑块,该逻辑会自动接收上游任务的结果并执行。

如何编写符合 Consumer 接口的 Lambda 表达式
直接回答:你需要提供一个形如 (result) -> { ... } 的 Lambda 表达式,其中参数类型与上游 CompletableFuture 的泛型类型一致,且方法体内部不包含任何返回值语句。

import java.util.concurrent.CompletableFuture;
public class ConsumerExample {
public static void main(String[] args) {
// 创建一个包含字符串结果的 CompletableFuture
CompletableFuture<string> future = CompletableFuture.supplyAsync(() -> "Hello, World!");
// 使用 thenAccept 接收结果并打印
future.thenAccept(result -> {
System.out.println("Received: " + result);
});
// 保持主线程存活以等待异步任务完成
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}</string>
运行上述代码后,控制台将输出:Received: Hello, World!
如何处理异常或空值情况下的 Consumer 逻辑
直接回答:当上游任务抛出异常时,thenAccept 中的 Consumer 不会执行,而是直接进入异常处理链;若需确保无论成功与否都执行特定逻辑,应改用 whenComplete 或结合 exceptionally 进行分支判断。

import java.util.concurrent.CompletableFuture;
public class ExceptionHandlingExample {
public static void main(String[] args) {
// 模拟一个可能失败的任务
CompletableFuture<string> failingFuture = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("Simulated Error");
});
// thenAccept 仅在成功时执行
failingFuture.thenAccept(result -> {
System.out.println("This will NOT print: " + result);
}).exceptionally(ex -> {
System.out.println("Error caught: " + ex.getMessage());
return null; // exceptionally 需要返回 T 类型的值,这里返回 null 兼容 String
});
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}</string>
运行上述代码后,控制台将输出:Error caught: Simulated Error
基于程序中某个输入、条件或结果的具体问题
直接回答:如果上游 CompletableFuture 的结果为 null,thenAccept 中的 Consumer 依然会被调用,但传入的参数值为 null,此时若在 Consumer 内部直接调用该参数的方法(如 result.length())将导致 NullPointerException。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











