面试题答案
一键面试在Java的CompletableFuture中,可以使用thenApply
、thenCompose
等方法来实现一个任务依赖于另一个任务的执行结果。
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());
}
}
在上述代码中:
fetchUserId
方法模拟了异步获取用户ID的操作,返回一个CompletableFuture<Long>
。fetchUserDetails
方法模拟了根据用户ID异步获取用户详细信息的操作,返回一个CompletableFuture<User>
。- 在
main
方法中,首先调用fetchUserId
获取用户ID,然后使用thenCompose
方法将用户ID传递给fetchUserDetails
方法,从而实现了任务的顺序依赖。 - 最后通过
userFuture.get()
获取最终的用户详细信息,并打印出来。