thencompose用于处理异步操作返回的另一个异步结果,实现链式调用;而thencombine用于合并两个独立的异步结果,将它们组合成一个新值。简单来说,前者是串行依赖,后者是并行汇聚。

如何理解 thenCompose 的链式依赖关系?
thenCompose接收一个函数作为参数,该函数接受上一个阶段的结果,并返回一个新的 CompletableFuture。它主要用于当一个异步任务依赖于前一个异步任务的完成时。例如,先获取用户ID,再根据ID获取用户详情。这两个步骤在逻辑上是串行的,但底层可以是异步执行的。

import java.util.concurrent.CompletableFuture;
public class ThenComposeExample {
public static void main(String[] args) throws Exception {
CompletableFuture<String> userIdFuture = CompletableFuture.supplyAsync(() -> "user123");
// thenCompose: 将上一个结果作为输入,返回新的异步任务
CompletableFuture<String> userDetailFuture = userIdFuture.thenCompose(id ->
CompletableFuture.supplyAsync(() -> "User Details for " + id)
);
System.out.println(userDetailFuture.get());
}
}
如何理解 thenCombine 的并行汇聚关系?
thenCombine接收另一个 CompletableFuture 和一个 BiFunction 作为参数。它将当前 Future 的结果和传入 Future 的结果一起传递给 BiFunction,生成一个新的结果。这适用于两个独立的任务完成后需要合并数据的场景,比如同时获取订单信息和库存信息,然后计算总价。
立即学习“Java免费学习笔记(深入)”;

import java.util.concurrent.CompletableFuture;
public class ThenCombineExample {
public static void main(String[] args) throws Exception {
CompletableFuture<Integer> orderFuture = CompletableFuture.supplyAsync(() -> 100);
CompletableFuture<Integer> stockFuture = CompletableFuture.supplyAsync(() -> 50);
// thenCombine: 合并两个独立 Future 的结果
CompletableFuture<Integer> totalFuture = orderFuture.thenCombine(stockFuture, (order, stock) -> order + stock);
System.out.println(totalFuture.get());
}
}
当使用 thenCompose 时,如果内部 Future 抛出异常会发生什么?
如果在 thenCompose 提供的函数中,内部创建的 CompletableFuture 抛出了未捕获的异常,或者该函数本身抛出异常,整个链式的 CompletableFuture 将会进入异常状态。此时,调用 get() 会抛出 ExecutionException。可以通过 exceptionally 或 handle 方法来捕获和处理这些异常,确保程序的健壮性。


















