web-dev-qa-db-fra.com

Différence entre thenAccept et thenApply

Je lis le document sur CompletableFuture et la description de thenAccept() est

Renvoie un nouveau CompletionStage qui, lorsque cette étape se termine normalement, est exécuté avec le résultat de cette étape comme argument de l'action fournie.

et pour thenApply() est

Renvoie un nouveau CompletionStage qui, lorsque cette étape se termine normalement, est exécuté avec le résultat de cette étape comme argument de la fonction fournie. ''

Quelqu'un peut-il expliquer la différence entre les deux avec quelques exemples simples?

24
Anqi Lu

Vous devez regarder les signatures de méthode complètes:

CompletableFuture<Void>     thenAccept(Consumer<? super T> action)
<U> CompletableFuture<U>    thenApply(Function<? super T,? extends U> fn)

thenAccept prend un Consumer et retourne un T=Void CF, c'est-à-dire qui ne porte pas de valeur, uniquement l'état d'achèvement.

thenApply d'autre part prend un Function et retourne un CF portant la valeur de retour de la fonction.

28
the8472

thenApply renvoie le résultat de l'étape actuelle, contrairement à thenAccept.

Lisez cet article: http://codeflex.co/Java-multithreading-completablefuture-explained/

CompletableFuture methods

9
Yuri

Comme the8472 clairement expliqué, ils se différencient par leur valeur de sortie et leurs arguments et donc ce que vous pouvez leur faire

CompletableFuture.completedFuture("FUTURE")
                .thenApply(r -> r.toLowerCase())
                .thenAccept(f -> System.out.println(f))
                .thenAccept(f -> System.out.println(f))
                .thenApply(f -> new String("FUTURE"))
                .thenAccept(f -> System.out.println(f));

future
null
FUTURE

les fonctions Apply appliquent une autre fonction et transmettent un futur contenant une valeur

les fonctions Accepter consomment cette valeur et renvoient le maintien futur nul

5
shahaf