“完成阶段”和“可完成未来”有什么区别

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

使用它们中的每一个有什么好处?

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

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


答案 1

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

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


答案 2

A 是 .但是,顾名思义,它是CompletableFutureCompletionStage

  • 可满足:可以使用 或 完成。completecompleteExceptionally
  • a:您可以使用方法等来获得结果。Futureget

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

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

推荐