什么是CompletableFuture?如何使用它进行异步编程?代码举例讲解

CompletableFuture 是一个能够表示异步计算结果的类。它可以用于异步编程,并且支持计算结果的组合和处理。

主要方法如下:

  • runAsync/supplyAsync:异步运行给定的 Runnable/Supplier
  • thenApply:当计算完成后,将当前 CompletableFuture 的结果应用到给定的 Function 函数
  • thenAccept:当计算完成后,使用给定的 Consumer 消费当前 CompletableFuture 的结果
  • thenRun:当计算完成后,运行给定的 Runnable
  • thenCombine:当两个 CompletableFuture 都完成后,将结果合并到给定的 BiFunction 函数中
  • handle:当 CompletableFuture 完成后,将结果或异常处理到给定的 BiConsumer 函数中
  • exceptionally:如果 CompletableFuture 完成时引起异常,则使用给定的 Function 计算异常结果
  • get():等待 CompletableFuture 完成并返回结果,或抛出异常

我们来看一些示例:

  1. runAsync – 异步执行无返回结果的任务
CompletableFuture.runAsync(() -> {
    doSomething(); 
});
  1. supplyAsync – 异步执行有返回结果的任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    return doSomething();
});
  1. thenApply – 消费 future 的结果并返回新的 future
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    return "Hello";
});

CompletableFuture<String> newFuture = future.thenApply(s -> s + " World");
  1. thenAccept – 消费 future 的结果但不返回新结果
CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {
    return "Hello";
}).thenAccept(s -> {
    System.out.println(s); 
});
  1. thenCombine – 合并两个 future 的结果
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    return "Hello";
});

CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    return "World";
});

CompletableFuture<String> combined = future1.thenCombine(future2, (s1, s2) -> s1 + " " + s2);  

所以,通过 CompletableFuture,我们可以用一种简单而优雅的方式实现异步编程,并得到异步结果的处理、合并等功能。