创建已经完成的 CompletableFuture<Void> 的正确方法是啥

Posted

技术标签:

【中文标题】创建已经完成的 CompletableFuture<Void> 的正确方法是啥【英文标题】:What is the correct way to create an already-completed CompletableFuture<Void>创建已经完成的 CompletableFuture<Void> 的正确方法是什么 【发布时间】:2018-03-20 09:11:18 【问题描述】:

我在 java 8 中使用 Completable futures,我想编写一个方法,基于接收到的参数,并行运行多个具有副作用的任务,然后返回它们的“组合”未来(使用CompletableFuture.allOf()),或者什么都不做并返回一个已经完成的未来。

但是,allOf 返回 CompletableFuture&lt;Void&gt;

public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)

创建一个已经完成的未来的唯一方法是使用completedFuture(),它需要一个值:

public static <U> CompletableFuture<U> completedFuture(U value)

返回一个新的 CompletableFuture,它已经用给定的值完成。

Void 是不可实例化的,所以我需要另一种方法来创建CompletableFuture&lt;Void&gt; 类型的已经完成的未来。

最好的方法是什么?

【问题讨论】:

你就不能CompletableFuture.&lt;Void&gt;(null)吗? 【参考方案1】:

由于Void不能被实例化,你只能用null结果完成CompletableFuture&lt;Void&gt;,这正是你在allOf()返回的future上调用join()时也会得到的结果已成功完成。

所以你可以使用

CompletableFuture<Void> cf = CompletableFuture.completedFuture(null);

获得这样一个已经完成的未来。

但你也可以使用

CompletableFuture<Void> cf = CompletableFuture.allOf();

表示结果不依赖于任何作业。结果将完全相同。

【讨论】:

【参考方案2】:

传递一个null 我猜:

CompletableFuture<Void> done = CompletableFuture.completedFuture(null);

【讨论】:

以上是关于创建已经完成的 CompletableFuture<Void> 的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

CompletableFuture 异步编排

CompletableFuture使用详解

Java8新的异步编程方式 CompletableFuture

转载- CompletableFuture使用详解

听说你还不知道CompletableFuture?

如何将异步CompletableFuture与完成的CompletableFuture结合起来?