‘CompletionStage’和’CompletableFuture’有什么区别?

我在每一个中都看到了一个例子,但我需要确切地知道深层有什么区别,因为有时候我觉得我可以用它们来得到相同的结果,所以我想知道这样我就可以选择正确的一?

使用它们各有什么好处?

像这个例子一样,两个都有效:

public CompletionStage getNextQueryUUID() { return CompletableFuture.supplyAsync(() -> { String nextId = dbRequestService.getNextRequestQueryUUID(); return ok(nextId); }, executor); } public CompletableFuture getNextQueryUUID() { return CompletableFuture.supplyAsync(() -> { String nextId = dbRequestService.getNextRequestQueryUUID(); return ok(nextId); }, executor); } 

此示例在Play framework运行。

CompletionStageCompletabeFuture是此接口的唯一实现类的接口。 通过查看CompletionStage的java文档,您会注意到CompletionStage接口提供了获取一个CompletionStage并将其转换为另一个CompletionStage 。 但是,CompletionStages返回的这些对象实际上是CompletabeFuture对象。

所以使用CompletabeFuture与使用CompletionStage CompletabeFuture是一回事,但后者可以作为未来可能的新类的基本接口,也可以作为许多降序类型的目标类型,就像我们一样倾向于做List integerList = new ArrayList<>(); 而不是ArrayList integerList = new ArrayList<>();

您可以阅读CompletionStage和CompletableFuture的post介绍,了解更多详情。

CompletableFutureCompletionStage 。 然而,顾名思义,它是

  • 可完成的:可以使用completecompleteExceptionally
  • Future :您可以使用get方法等来获得结果。

恕我直言,在大多数API中,就像你的例子中一样,你应该使用CompletionStage ,因为

  • 实现通常提供完成阶段的机制。 您不需要/想要向调用者公开像complete这样的方法。
  • 调用者应该以异步方式使用返回值,而不是使用像Future提供的阻塞调用。

一个是接口,另一个是类。 通常你返回接口而不是实现,但我怀疑这是这种情况。 返回CompletableFuture对我来说更有意义。

除非你当然使用该接口的其他实现,比如Spring的DelegatingCompletableFuture ,但是从你的例子中你不是。