Maison  >  Article  >  Java  >  Comment utiliser les fonctions thenCompose et thenCombine de CompletableFuture pour les opérations de fusion asynchrones en Java

Comment utiliser les fonctions thenCompose et thenCombine de CompletableFuture pour les opérations de fusion asynchrones en Java

WBOY
WBOYoriginal
2023-06-26 15:01:403030parcourir

En Java, nous rencontrons souvent des scénarios nécessitant des opérations asynchrones. Pour cette situation, Java 8 a introduit la classe CompletableFuture, qui nous fournit de riches outils de programmation asynchrone pour rendre la programmation asynchrone plus simple et plus facile. Parmi elles, thenCompose et thenCombine sont deux méthodes d'opération asynchrone combinées couramment utilisées dans la classe CompleteableFuture.

1. L'utilisation de thenCompose

La méthode ThethenCompose est utilisée pour convertir une instance CompletableFuture en une autre instance CompletableFuture. Plus précisément, il reçoit un paramètre Function qui prend en entrée le résultat renvoyé par le précédent CompletableFuture et renvoie un nouvel objet CompletableFuture. Voici un exemple :

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    // 模拟计算耗时
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 10;
});

CompletableFuture<Integer> result = future.thenCompose(value -> CompletableFuture.supplyAsync(() -> value * 2));

result.whenComplete((res, ex) -> {
    if (ex != null) {
        ex.printStackTrace();
    } else {
        System.out.println(res);
    }
});

Dans le code ci-dessus, nous créons d'abord une instance CompletableFuture, qui simulera le temps de calcul dans un autre thread. Ensuite, nous utilisons la méthode thenCompose pour la convertir en une nouvelle instance CompletableFuture, qui multiplie par 2 le résultat renvoyé par la précédente CompletableFuture. Enfin, nous utilisons la méthode whenComplete pour afficher des résultats ou des messages d'erreur.

2. L'utilisation de la méthode thenCombine

ThenCombine est utilisée pour fusionner deux instances CompletableFuture en une seule. Plus précisément, il reçoit une autre instance CompletableFuture et un paramètre BiFunction qui prend en entrée les résultats renvoyés par les deux CompletableFutures et renvoie un nouvel objet CompletableFuture. Voici un exemple :

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
    // 模拟计算耗时
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 10;
});

CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
    // 模拟计算耗时
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 5;
});

CompletableFuture<Integer> result = future1.thenCombine(future2, (value1, value2) -> value1 + value2);

result.whenComplete((res, ex) -> {
    if (ex != null) {
        ex.printStackTrace();
    } else {
        System.out.println(res);
    }
});

Dans le code ci-dessus, nous créons deux instances CompletableFuture, qui simulent respectivement l'exécution de deux tâches informatiques. Ensuite, nous utilisons la méthode thenCombine pour fusionner les deux instances CompletableFuture dans une nouvelle instance qui ajoute les résultats renvoyés par les deux premières CompletableFutures. Enfin, nous utilisons la méthode whenComplete pour afficher des résultats ou des messages d'erreur.

3. Utilisez thenCompose et thenCombine pour implémenter des opérations asynchrones complexes

Nous avons déjà introduit l'utilisation des méthodes thenCompose et thenCombine, et ce sont toutes deux des méthodes d'opération asynchrone très utiles. En fait, nous pouvons également les utiliser pour mettre en œuvre des opérations asynchrones plus complexes, comme des opérations d'agrégation sur plusieurs résultats de calcul.

CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
    // 模拟计算耗时
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 10;
});

CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
    // 模拟计算耗时
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 5;
});

CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> {
    // 模拟计算耗时
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return 20;
});

CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(future1, future2, future3);

CompletableFuture<Integer> result = combinedFuture.thenCompose(
        voidResult -> CompletableFuture.supplyAsync(() -> {
            int sum = future1.join() + future2.join() + future3.join();
            return sum;
        }));

result.whenComplete((res, ex) -> {
    if (ex != null) {
        ex.printStackTrace();
    } else {
        System.out.println(res);
    }
});

Dans le code ci-dessus, nous avons créé trois instances CompletableFuture, chacune simulant l'exécution d'une tâche informatique et renvoyant les résultats correspondants. Ensuite, nous utilisons la méthode CompletableFuture.allOf pour combiner ces trois instances et créer une nouvelle instance CompletableFuture. Il convient de noter ici que la méthode allOf renvoie une instance CompletableFuture de type Void et que sa valeur de retour est nulle.

Ensuite, nous utilisons la méthode thenCompose pour convertir l'instance CompletableFuture ci-dessus qui renvoie null en une nouvelle instance CompletableFuture, qui ajoute les résultats renvoyés par les trois CompletableFutures précédentes. Dans la fonction de rappel de la méthode thenCompose, nous utilisons la méthode join() pour obtenir la valeur de résultat de chaque instance CompletableFuture et effectuer les calculs correspondants. Enfin, nous utilisons la méthode whenComplete pour afficher les résultats ou les messages d'erreur.

En général, thenCompose et thenCombine sont des méthodes très utiles dans la classe CompleteableFuture. Elles peuvent nous aider à effectuer des opérations asynchrones plus facilement et à améliorer la concurrence et l'efficacité d'exécution du programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn