MST

星途 面试题库

面试题:Java中CompletableFuture的thenAccept与thenApply的区别及应用

在Java的CompletableFuture中,thenAccept和thenApply方法看似相似,实则有重要区别。请详细说明这两个方法的区别,并举例说明在何种情况下应优先使用thenAccept,何种情况下应优先使用thenApply。同时,代码示例需展示如何链式调用这两个方法以实现复杂的异步任务处理。
28.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 返回值类型
    • thenAccept:返回CompletableFuture<Void>,它不返回新的计算结果,而是在CompletableFuture完成时执行一个副作用操作(例如打印日志、写入文件等),该操作不返回值。
    • thenApply:返回CompletableFuture<U>,它会返回一个新的CompletableFuture,该CompletableFuture的值是通过对原CompletableFuture的值进行转换操作得到的。
  2. 参数类型
    • thenAccept:接受一个Consumer<? super T>类型的参数,Consumer接口的accept方法只接受一个参数且无返回值。
    • thenApply:接受一个Function<? super T,? extends U>类型的参数,Function接口的apply方法接受一个参数并返回一个结果。

使用场景

  1. 优先使用thenAccept的场景
    • 当你只需要在异步任务完成时执行一些不需要返回值的操作,例如记录日志、更新状态等。例如,当一个用户注册成功后,你只需要记录注册成功的日志,不需要返回额外的信息。
  2. 优先使用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开启一个异步任务返回10thenApply对这个结果进行乘法运算,thenAccept打印最终结果。展示了链式调用这两个方法实现复杂异步任务处理的过程。