thenAccept 和 thenApply 的区别

Posted

技术标签:

【中文标题】thenAccept 和 thenApply 的区别【英文标题】:Difference between thenAccept and thenApply 【发布时间】:2017-12-23 18:16:36 【问题描述】:

我正在阅读CompletableFuture 上的文档,thenAccept() 的描述是

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

对于thenApply()

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

谁能通过一些简单的例子来解释两者之间的区别?

【问题讨论】:

【参考方案1】:

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

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

thenAccept 接受Consumer 并返回T=Void CF,即不带值的CF,只有完成状态。

另一方面,thenApply 接受 Function 并返回一个带有函数返回值的 CF。

【讨论】:

如果我们把它比作Stream,那么Accept()有点类似于forEach(Consumer),而theApply类似于map(Function)【参考方案2】:

thenApply 返回当前阶段的结果,而thenAccept 不返回。

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

【讨论】:

【参考方案3】:

正如 the8472 清楚解释的那样,它们的区别在于它们的输出值和参数,因此你可以用它们做什么

CompletableFuture.completedFuture("FUTURE")
                    .thenApply(f -> f.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

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

Accept 函数使用这个值并返回未来持有的 void

【讨论】:

【参考方案4】:

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

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

ThenAccept 基本上接受一个消费者并将计算结果传递给它CompletableFuture&lt;Void&gt;

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

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

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

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

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

【讨论】:

以上是关于thenAccept 和 thenApply 的区别的主要内容,如果未能解决你的问题,请参考以下文章

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

CompletableFuture异步编排(线程串行化代码示例)

Java 8 的异步编程利器 CompletableFuture 详解

Java 8 的异步编程利器 CompletableFuture 详解

Java 8 的异步编程利器 CompletableFuture 详解