面试题答案
一键面试区别
- 返回值类型:
thenAccept
:返回CompletableFuture<Void>
,它不返回新的计算结果,而是在CompletableFuture
完成时执行一个副作用操作(例如打印日志、写入文件等),该操作不返回值。thenApply
:返回CompletableFuture<U>
,它会返回一个新的CompletableFuture
,该CompletableFuture
的值是通过对原CompletableFuture
的值进行转换操作得到的。
- 参数类型:
thenAccept
:接受一个Consumer<? super T>
类型的参数,Consumer
接口的accept
方法只接受一个参数且无返回值。thenApply
:接受一个Function<? super T,? extends U>
类型的参数,Function
接口的apply
方法接受一个参数并返回一个结果。
使用场景
- 优先使用thenAccept的场景:
- 当你只需要在异步任务完成时执行一些不需要返回值的操作,例如记录日志、更新状态等。例如,当一个用户注册成功后,你只需要记录注册成功的日志,不需要返回额外的信息。
- 优先使用thenApply的场景:
- 当你需要对异步任务的结果进行转换,生成一个新的结果供后续异步任务使用时。例如,你从数据库中异步获取用户ID,然后需要将这个ID转换为用户名并继续后续操作。
代码示例
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class CompletableFutureExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture.supplyAsync(() -> {
System.out.println("执行异步任务1");
return 10;
})
.thenApply(result -> {
System.out.println("对异步任务1的结果进行转换,结果为: " + result);
return result * 2;
})
.thenAccept(finalResult -> {
System.out.println("最终结果为: " + finalResult);
})
.get();
}
}
在上述代码中,supplyAsync
开启一个异步任务返回10
,thenApply
对这个结果进行乘法运算,thenAccept
打印最终结果。展示了链式调用这两个方法实现复杂异步任务处理的过程。