MST

星途 面试题库

面试题:Java中CompletableFuture如何处理顺序依赖操作

请说明在Java的CompletableFuture中,如何实现一个任务依赖于另一个任务的执行结果,并举例代码实现从获取用户ID,再根据ID获取用户详细信息这一顺序依赖操作。
22.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java的CompletableFuture中,可以使用thenApplythenCompose等方法来实现一个任务依赖于另一个任务的执行结果。

thenApply方法适用于返回结果为CompletableFuture类型的情况,它接收一个函数作为参数,该函数的输入是前一个任务的执行结果,输出是新的结果。

thenCompose方法则用于处理前一个任务返回的结果是CompletableFuture类型的情况,它会将前一个任务的结果作为参数传递给下一个CompletableFuture

以下是一个代码示例,展示了如何从获取用户ID,再根据ID获取用户详细信息这一顺序依赖操作:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

class User {
    private Long id;
    private String name;

    public User(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

public class CompletableFutureExample {

    // 模拟获取用户ID的异步操作
    public static CompletableFuture<Long> fetchUserId() {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟一些异步操作,比如查询数据库
            return 1L;
        });
    }

    // 模拟根据用户ID获取用户详细信息的异步操作
    public static CompletableFuture<User> fetchUserDetails(Long userId) {
        return CompletableFuture.supplyAsync(() -> {
            // 模拟一些异步操作,比如根据ID查询数据库
            return new User(userId, "John Doe");
        });
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<User> userFuture = fetchUserId()
               .thenCompose(CompletableFutureExample::fetchUserDetails);

        User user = userFuture.get();
        System.out.println("User ID: " + user.getId());
        System.out.println("User Name: " + user.getName());
    }
}

在上述代码中:

  1. fetchUserId方法模拟了异步获取用户ID的操作,返回一个CompletableFuture<Long>
  2. fetchUserDetails方法模拟了根据用户ID异步获取用户详细信息的操作,返回一个CompletableFuture<User>
  3. main方法中,首先调用fetchUserId获取用户ID,然后使用thenCompose方法将用户ID传递给fetchUserDetails方法,从而实现了任务的顺序依赖。
  4. 最后通过userFuture.get()获取最终的用户详细信息,并打印出来。