繁体   English   中英

“CompletionStage”和“CompletableFuture”有什么区别

[英]What is the difference between 'CompletionStage' and 'CompletableFuture'

我在他们每个人中都看到了一个例子,但我需要确切地知道 deep 有什么不同,因为有时我认为我可以同时使用它们来获得相同的结果,所以我想知道以便我可以选择正确的一?

分别使用它们有什么好处?

像这个例子一样都有效:

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运行。

CompletionStage<T>是一个接口,其中CompletableFuture<T>是当前唯一的实现类。 通过查看CompletionStage<T>的 javadoc,您会注意到它提供了用于获取一个CompletionStage<T>并将其转换为另一个CompletionStage<T> 但是, CompletionStage<T>返回的值实际上是CompletabeFuture<T>对象。

因此,使用CompletabeFuture<T>与使用CompletionStage<T>有点相同,但后者可以用作将来可能的新类的基本接口,以及作为许多降序类型的目标类型,就像我们一样倾向于做List<Integer> integerList = new ArrayList<>(); 而不是ArrayList<Integer> integerList = new ArrayList<>();

CompletableFuture是一个CompletionStage 然而,正如它的名字所暗示的那样,

  • completable:可以使用completecompleteExceptionally
  • a Future :您可以使用get方法等来获取结果。

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

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

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

除非您当然使用该接口的其他一些实现,例如 Spring 的DelegatingCompletableFuture ,但从您的示例来看,您不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM