web-dev-qa-db-fra.com

Quelle est la différence entre 'CompletionStage' et 'CompletableFuture'

J'ai vu un exemple dans chacun d'entre eux, mais j'ai besoin de savoir exactement quelle est la différence de profondeur. Parce que parfois je pense pouvoir utiliser les deux pour obtenir le même résultat un?

quel est l'avantage d'utiliser chacun d'eux?

Comme cet exemple les deux sont travaillés:

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);
}

Cet exemple s’exécute dans Play framework.

17
Ebraheem Alrabee'

Une CompletableFuture est une CompletionStage. Cependant, comme son nom l'indique, il est

  • completable: Il peut être complété avec complete ou completeExceptionally.
  • Future: Vous pouvez utiliser la méthode get, etc. pour obtenir le résultat.

IMHO, dans la plupart des API, comme dans votre exemple, vous devriez utiliser CompletionStage, car

  • L'implémentation fournit généralement le mécanisme pour terminer l'étape. Vous n'avez pas besoin/ne voulez pas exposer des méthodes telles que complete à l'appelant.
  • L'appelant doit utiliser la valeur renvoyée de manière asynchrone au lieu d'utiliser des appels bloquants tels que get fourni par Future.
7
Xiao

L'un est une interface et l'autre est une classe. Habituellement, vous retournez l'interface et non l'implémentation, mais je doute que ce soit le cas ici. Retourner CompletableFuture a plus de sens pour moi. 

Sauf si vous utilisez bien sûr une autre implémentation de cette interface, comme la variable DelegatingCompletableFuture de Spring, mais d'après vos exemples, vous ne l'êtes pas. 

1
Eugene