‘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
运行。
CompletionStage
是CompletabeFuture
是此接口的唯一实现类的接口。 通过查看CompletionStage
的java文档,您会注意到CompletionStage接口提供了获取一个CompletionStage并将其转换为另一个CompletionStage
。 但是,CompletionStages返回的这些对象实际上是CompletabeFuture
对象。
所以使用CompletabeFuture
与使用CompletionStage
CompletabeFuture
是一回事,但后者可以作为未来可能的新类的基本接口,也可以作为许多降序类型的目标类型,就像我们一样倾向于做List
而不是ArrayList
您可以阅读CompletionStage和CompletableFuture的post介绍,了解更多详情。
CompletableFuture
是CompletionStage
。 然而,顾名思义,它是
- 可完成的:可以使用
complete
或completeExceptionally
。 -
Future
:您可以使用get
方法等来获得结果。
恕我直言,在大多数API中,就像你的例子中一样,你应该使用CompletionStage
,因为
- 实现通常提供完成阶段的机制。 您不需要/想要向调用者公开像
complete
这样的方法。 - 调用者应该以异步方式使用返回值,而不是使用像
Future
提供的阻塞调用。
一个是接口,另一个是类。 通常你返回接口而不是实现,但我怀疑这是这种情况。 返回CompletableFuture
对我来说更有意义。
除非你当然使用该接口的其他实现,比如Spring的DelegatingCompletableFuture
,但是从你的例子中你不是。