CompletableFuture
提供了一系列以 then
开头的方法,它们允许你在异步操作完成之后执行不同的操作。这些方法大致可以分为几类,每类都有其特定的用途。下面是一些主要的方法及其区别:
1. thenApply
和 thenApplyAsync
-
thenApply
:- 用于在当前
CompletableFuture
完成后,对其结果进行转换或进一步处理。 - 返回一个新的
CompletableFuture
,其结果是应用了提供的函数后的结果。 - 函数默认由
ForkJoinPool.commonPool()
执行。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<String> upperCaseFuture = future.thenApply(String::toUpperCase);
- 用于在当前
-
thenApplyAsync
:- 类似于
thenApply
,但允许你指定一个Executor
来执行转换函数。 - 这样可以更好地控制执行上下文和线程资源。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<String> upperCaseFutureAsync = future.thenApplyAsync(String::toUpperCase, executor);
- 类似于
2. thenAccept
和 thenAcceptAsync
-
thenAccept
:- 用于在当前
CompletableFuture
完成后,消费其结果。 - 不返回新的
CompletableFuture
,而是消费结果。 - 函数默认由
ForkJoinPool.commonPool()
执行。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); future.thenAccept(System.out::println);
- 用于在当前
-
thenAcceptAsync
:- 类似于
thenAccept
,但允许你指定一个Executor
来执行消费函数。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); future.thenAcceptAsync(System.out::println, executor);
- 类似于
3. thenRun
和 thenRunAsync
-
thenRun
:- 用于在当前
CompletableFuture
完成后,执行一个无返回值的动作。 - 不关心结果,只执行一个动作。
- 动作默认由
ForkJoinPool.commonPool()
执行。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); future.thenRun(() -> System.out.println("Completed"));
- 用于在当前
-
thenRunAsync
:- 类似于
thenRun
,但允许你指定一个Executor
来执行动作。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "hello"); future.thenRunAsync(() -> System.out.println("Completed"), executor);
- 类似于
4. thenCombine
和 thenCombineAsync
-
thenCombine
:- 用于将当前
CompletableFuture
的结果与另一个CompletableFuture
的结果结合起来,形成一个新的CompletableFuture
。 - 函数默认由
ForkJoinPool.commonPool()
执行。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 123); CompletableFuture<String> combinedFuture = future1.thenCombine(future2, (s, i) -> s + i);
- 用于将当前
-
thenCombineAsync
:- 类似于
thenCombine
,但允许你指定一个Executor
来执行组合函数。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 123); CompletableFuture<String> combinedFutureAsync = future1.thenCombineAsync(future2, (s, i) -> s + i, executor);
- 类似于
5. thenCompose
和 thenComposeAsync
-
thenCompose
:- 用于在当前
CompletableFuture
完成后,根据其结果创建并返回一个新的CompletableFuture
。 - 适用于链式调用,其中下一个操作依赖于前一个操作的结果。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<String> composedFuture = future1.thenCompose(s -> CompletableFuture.supplyAsync(() -> s.toUpperCase()));
- 用于在当前
-
thenComposeAsync
:- 类似于
thenCompose
,但允许你指定一个Executor
来执行下一个CompletableFuture
的操作。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "hello"); CompletableFuture<String> composedFutureAsync = future1.thenComposeAsync(s -> CompletableFuture.supplyAsync(() -> s.toUpperCase()), executor);
- 类似于
总结
thenApply
和thenApplyAsync
用于转换结果。thenAccept
和thenAcceptAsync
用于消费结果。thenRun
和thenRunAsync
用于执行动作。thenCombine
和thenCombineAsync
用于结合两个CompletableFuture
的结果。thenCompose
和thenComposeAsync
用于创建新的CompletableFuture
链。
这些方法可以帮助你构建复杂的异步工作流,同时保持代码的可读性和可维护性。