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<Void>
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 详解