我已经在每一个中看到了一个例子,但是我需要确切地知道深层有什么区别,因为有时我认为我可以使用它们来获得相同的结果,所以我想知道这样我就可以选择正确的?
使用它们的好处是什么?
就像这个例子一样,两者都有效:
public CompletionStage<Result> getNextQueryUUID() {
return CompletableFuture.supplyAsync(() -> {
String nextId = dbRequestService.getNextRequestQueryUUID();
return ok(nextId);
}, executor);
}
public CompletableFuture<Result> getNextQueryUUID() {
return CompletableFuture.supplyAsync(() -> {
String nextId = dbRequestService.getNextRequestQueryUUID();
return ok(nextId);
}, executor);
}
此示例在
Play framework
中运行。
答案 0 :(得分:11)
CompletionStage<T>
是CompletabeFuture<T>
是此接口的唯一实现类的接口。通过查看CompletionStage<T>
的java文档,您会注意到CompletionStage接口提供了获取一个CompletionStage并将其转换为另一个CompletionStage
的方法。但是,CompletionStages返回的这些对象实际上是它们自己的CompletabeFuture<T>
个对象。
因此使用CompletabeFuture<T>
与使用CompletionStage<T>
是一回事,但后者可以用作未来可能的新类的基本接口,也可以作为许多目标类型降序类型就像我们倾向于List<Integer> integerList = new ArrayList<>();
而不是ArrayList<Integer> integerList = new ArrayList<>();
您可以阅读帖子introduction to CompletionStage and CompletableFuture了解更多详情。
答案 1 :(得分:10)
CompletableFuture
是CompletionStage
。但是,顾名思义,它是
complete
或完成
completeExceptionally
。Future
:您可以使用get
方法等来获得结果。恕我直言,在大多数API中,如您的示例中所示,您应该使用CompletionStage
,因为
complete
等方法。get
提供的Future
之类的阻止调用。答案 2 :(得分:1)
一个是接口,另一个是类。通常你返回接口而不是实现,但我怀疑这是这种情况。返回CompletableFuture
对我来说更有意义。
除非你正在使用该界面的其他一些实现,比如Spring DelegatingCompletableFuture
,但是从你的例子中你不是。