, но из твоих примеров тебя нет.

ел пример в каждом из них, но мне нужно точно знать, в чем разница в глубине, потому что иногда я думаю, что могу использовать оба из них, чтобы получить тот же результат, поэтому я хочу знать, чтобы я мог выбрать правильный один?

какая польза от использования каждого из них?

Как этот пример, оба работают:

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.

Ответы на вопрос(3)

CompletableFuture этоCompletionStage, Однако, как следует из его названия, это

завершаемо: может быть завершено с помощьюcomplete или жеcompleteExceptionally.a Future: Вы можете использоватьget метод и т. д., чтобы получить результат.

ИМХО, в большинстве PI, как в вашем примере, вы должны использоватьCompletionStage, потому что

Реализация обычно обеспечивает механизм для завершения этапа. Вам не нужно / не хотите выставлять такие методы, какcomplete звонящему.Ожидается, что вызывающая сторона будет использовать возвращаемое значение в асинхронном режиме вместо использования блокирующих вызовов, таких какget предоставленоFuture.
Решение Вопроса

CompletionStage<T> это интерфейс, которыйCompletabeFuture<T> является единственным реализующим классом этого интерфейса. Глядя на документацию по Java дляCompletionStage<T>вы заметите, что интерфейс CompletionStage предоставляет методы для взятия одного CompletionStage и преобразования его в другойCompletionStage, Однако эти объекты возвращаются CompletionStages как фактически самиCompletabeFuture<T> объекты.

Итак, используяCompletabeFuture<T> вроде то же самое, что с использованиемCompletionStage<T> но последний может быть использован в качестве базового интерфейса для возможных новых классов в будущем, а также в качестве целевого типа для многих нисходящих типов, как мы обычно делаемList<Integer> integerList = new ArrayList<>(); скорее, чемArrayList<Integer> integerList = new ArrayList<>();

Вы можете прочитать поствведение в CompletionStage и CompletableFuture Больше подробностей.

 Aomine30 нояб. 2017 г., 12:31
@EbraheemAlrabeeCompletionStage Интерфейс просто содержит абстрактные методы для вычислений, которые могут быть или не быть асинхронными. так что, конечно,реализации Тип почти всегда будет иметь больше функциональных возможностей, чем его базовый тип, поэтому, как упомянул Евгений в своем посте, если вы не используете какую-либо другую реализацию этого интерфейса, то, вероятно, имеет смысл использоватьCompletableFuture<T> как тип целисейчас.Однако в будущем может быть больше реализующих классов, вы никогда не знаете.
 Ebraheem Alrabee'30 нояб. 2017 г., 12:22
Я думаю, что впервые это похоже на разницу междуThread класс иRunnable интерфейс, так что есть больше методов для использования, но еще больше, что будет полезно, когда я определю поле типаCompletableFuture<T> вместо возврата значения методом.

а другой - класс. Обычно вы возвращаете интерфейс, а не реализацию, но я сомневаюсь, что это так. возвратеCompletableFuture имеет больше смысла для меня.

Если не Вы используете какую-то другую реализацию этого интерфейса, например, SpringDelegatingCompletableFuture, но из твоих примеров тебя нет.

Ваш ответ на вопрос