Java 8中引入了CompletableFuture类,它是一种方便的异步编程工具,能够处理各种异步操作,如网络恳求、文件IO和数据库操作等。它是Java的Future接口的扩展,供给了一些有用的办法来创立、操作和组合异步操作。本文将详细介绍CompletableFuture的运用办法。

创立CompletableFuture

CompletableFuture供给了多种办法来创立CompletableFuture目标,如:

  • 1.运用CompletableFuture.supplyAsync()办法创立异步履行的Supplier,Supplier中的代码会在异步线程中履行,代码履行结束后,CompletableFuture将会得到履行成果。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
  • 2.运用CompletableFuture.runAsync()办法创立异步履行的Runnable,Runnable中的代码会在异步线程中履行,代码履行结束后,CompletableFuture将会得到null作为履行成果。
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    //异步履行的代码
});
  • 3.运用CompletableFuture.completedFuture()办法创立一个现已完结的CompletableFuture目标。
CompletableFuture<String> future = CompletableFuture.completedFuture("Hello");
  • 4.运用CompletableFuture的构造办法创立CompletableFuture目标。
CompletableFuture<String> future = new CompletableFuture<>();

这种办法一般用于在履行某个操作之前创立一个CompletableFuture目标,并将其传递给其他办法,以便在异步操作完结后将成果传递回来。

处理CompletableFuture的成果

当异步操作完结时,能够经过CompletableFuture的get()办法获取履行成果。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
String result = future.get();
System.out.println(result); //输出"Hello"

但是,get()办法是一个阻塞的办法,它会一向等候异步操作完结,并回来成果或者抛出反常。假如你不想阻塞当时线程,你能够运用回调函数的办法来处理CompletableFuture的成果。

  • 1.运用thenApply()办法处理CompletableFuture的成果。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = future.thenApply(result -> result + " World");
System.out.println(future2.get()); //输出"Hello World"

在这个比如中,咱们运用thenApply()办法来处理CompletableFuture的成果。它承受一个Function函数,用于将CompletableFuture的成果转换为另一个值。

  • 2.运用thenAccept()办法处理CompletableFuture的成果。
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");
future.thenAccept(result -> System.out.println(result + " World"));

在这个比如中,咱们运用thenAccept()办法来处理CompletableFuture的成果。它承受一个Consumer函数,用于处理CompletableFuture的成果,但是不回来任何成果。

  • 3.运用thenCompose()办法组合多个CompletableFuture。
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
CompletableFuture<String> future3 = future1.thenCompose(result1 -> future2.thenApply(result2 -> result1 + " " + result2));
     try {
        System.out.println(future3.get());
    } catch (InterruptedException e) {
          throw new RuntimeException(e);
    } catch (ExecutionException e) {
        throw new RuntimeException(e);
    }

在这个比如中,咱们运用thenCompose()办法来组合多个CompletableFuture目标。它承受一个Function函数,该函数将CompletableFuture的成果转换为另一个CompletableFuture目标。在这个比如中,咱们先运用future1来创立一个新的CompletableFuture目标,然后将future2的成果作为参数传递给该目标的处理函数。

  • 4.运用thenCombine()办法组合多个CompletableFuture。
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
CompletableFuture<Integer> future3 = future1.thenCombine(future2, (result1, result2) -> result1 + result2);
System.out.println(future3.get()); //输出30

在这个比如中,咱们运用thenCombine()办法来组合多个CompletableFuture目标。它承受另一个CompletableFuture目标和一个BiFunction函数,该函数用于将两个CompletableFuture的成果合并为一个新的成果。

处理CompletableFuture的反常

当CompletableFuture履行过程中出现反常时,咱们需求运用exceptionally()办法来处理反常。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    throw new RuntimeException("反常信息");
});
future.exceptionally(ex -> {
    System.out.println(ex.getMessage()); //输出"反常信息"
    return 0;
});

在这个比如中,咱们运用exceptionally()办法来处理CompletableFuture的反常。它承受一个Function函数,用于处理反常并回来一个默认值。

等候多个CompletableFuture履行结束

有时咱们需求等候多个CompletableFuture目标履行结束后再持续履行下一步操作。咱们能够运用CompletableFuture的allOf()办法或anyOf()办法来等候多个CompletableFuture目标履行结束。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
CompletableFuture<Void> allFuture = CompletableFuture.allOf(future1, future2);
allFuture.get();
CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2);
System.out.println(anyFuture.get()); //输出"Hello"或"World"

在这个比如中,咱们运用allOf()办法来等候一切的CompletableFuture目标履行结束,并运用anyOf()办法来等候任何一个CompletableFuture目标履行结束。

总结

CompletableFuture是Java 8中供给的一种非常方便的异步编程工具,它能够处理各种异步操作,并供给了丰富的办法来创立、操作和组合CompletableFuture目标。在实际使用中,咱们能够根据实际需求选择适宜的办法来运用CompletableFuture,提高代码的性能和可读性。