thenAccept和thenApply之间的区别

时间:2017-07-18 18:13:25

标签: java asynchronous java-8 completable-future

我正在CompletableFuture上阅读该文档,而thenAccept()的说明是

  

返回一个新的CompletionStage,当此阶段正常完成时,将使用此阶段的结果作为所提供操作的参数执行。

thenApply()

  

返回一个新的CompletionStage,当这个阶段正常完成时,将以此阶段的结果作为所提供函数的参数执行.```

有人可以通过一些简单的例子解释两者之间的区别吗?

4 个答案:

答案 0 :(得分:27)

您需要查看完整的方法签名:

CompletableFuture<Void>     thenAccept(Consumer<? super T> action)
<U> CompletableFuture<U>    thenApply(Function<? super T,? extends U> fn)

thenAccept需要Consumer并返回T=Void个CF,即一个不带值的,只有完成状态。

另一方面,

thenApplyFunction并返回带有函数返回值的CF。

答案 1 :(得分:9)

thenApply会返回curent阶段的结果,而thenAccept则不会。

阅读这篇文章:http://codeflex.co/java-multithreading-completablefuture-explained/

CompletableFuture methods

答案 2 :(得分:3)

正如 the8472 清楚解释的那样,它们的输出值和args是不同的,因此你可以做什么

CompletableFuture.completedFuture("FUTURE")
                .thenApply(r -> r.toLowerCase())
                .thenAccept(f -> System.out.println(f))
                .thenAccept(f -> System.out.println(f))
                .thenApply(f -> new String("FUTURE"))
                .thenAccept(f -> System.out.println(f));

future
null
FUTURE

应用函数应用另一个函数并传递持有值的未来

Accept 函数使用此值并返回将来的持有空白

答案 3 :(得分:1)

我会以我记得两者之间的区别的方式回答这个问题: 考虑以下未来。

CompletableFuture<String> completableFuture
  = CompletableFuture.supplyAsync(() -> "Hello");

ThenAccept基本上是一个消费者,并将计算结果CompletableFuture<Void>

传递给它。
CompletableFuture<Void> future = completableFuture
  .thenAccept(s -> System.out.println("Computation returned: " + s));

您可以将其与forEach中的streams关联起来,以便于记忆。

thenApply接受Function实例的情况下,使用它来处理结果并返回一个保存有函数返回值的Future:

CompletableFuture<String> future = completableFuture
  .thenApply(s -> s + " World");

您可以将其与此map中的streams相关联,因为它实际上正在执行转换。