Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Défi : CompletableFuture | Meilleures Pratiques de la Programmation Multithread
Multithreading en Java

bookDéfi : CompletableFuture

Tâche

Votre tâche consiste à concevoir un système qui gère les commandes et effectue des calculs supplémentaires tels que les taxes et les frais de livraison. Il est nécessaire de traiter plusieurs commandes de manière asynchrone, d'effectuer les calculs requis, et d'afficher le montant total pour chaque commande une fois que tous les calculs sont terminés.

Chaque commande possède un identifiant unique et un prix qui lui est associé. (Classe InitMap)

Les ID et leurs montants sont stockés dans une Map au sein de la classe InitMap. Les clés de cette Map (qui correspondent aux ID de commande) sont celles sur lesquelles nous itérons dans la méthode processOrders().

La récupération des données de commande s'effectue de manière asynchrone et retourne le montant de la commande. Ceci est géré par la classe OrderService, en particulier par la méthode fetchOrderAmount(String orderId).

La taxe est calculée à 15% du montant de la commande. Cette opération est assurée par la classe CalculationService, via la méthode calculateTax().

Les frais de livraison sont calculés à 10% du montant de la commande. Ceci est également géré par la classe CalculationService, via la méthode calculateShipping().

Note
Remarque

Votre tâche principale consiste à implémenter la logique étape par étape dans la classe task du package OrderProcessingExample, dans la méthode processOrders().

Étapes d’implémentation

1. Recevoir le montant de la commande de manière asynchrone à l’aide du service de commande :

  • Créer un objet CompletableFuture pour récupérer le montant de la commande de façon asynchrone ;
  • Appeler la méthode fetchOrderAmount() de OrderService en passant l’identifiant de la commande.
Note
Remarque

La méthode fetchOrderAmount() utilise CompletableFuture.supplyAsync() pour exécuter la tâche de manière asynchrone et retourne le montant de la commande, selon son identifiant.

2. Après avoir récupéré le montant de la commande, calcul du taxe de manière asynchrone à l'aide du service de calcul :

  • Utiliser thenCompose() pour exécuter la tâche de façon séquentielle après l'obtention du montant de la commande. Appeler la méthode calculateTax() de CalculationService en passant le montant de la commande.
Note
Remarque

La méthode calculateTax() utilise CompletableFuture.supplyAsync() pour exécuter la tâche de manière asynchrone et retourne une taxe égale à 15 % du montant de la commande.

3. Après avoir reçu le montant de la commande, calcul asynchrone du coût d'expédition à l'aide du service de calcul :

  • Utiliser thenCompose() pour exécuter la tâche de manière séquentielle après la réception du montant de la commande. Appeler la méthode calculateShipping de CalculationService en passant le montant de la commande.
Note
Remarque

La méthode calculateShipping() utilise CompletableFuture.supplyAsync() pour exécuter la tâche de façon asynchrone et retourne un coût d'expédition égal à 10 % du montant de la commande.

4. Combinaison des calculs asynchrones de la taxe et du coût d'expédition pour obtenir le coût supplémentaire total :

  • Utiliser thenCombine() pour combiner les deux résultats CompletableFuture de la taxe et de l'expédition afin d'obtenir le coût supplémentaire total (taxe + coût d'expédition).

5. Combinaison du montant de la commande et du coût supplémentaire total pour obtenir le montant total de la commande :

  • Utiliser thenCombine() pour combiner les deux résultats CompletableFuture du coût supplémentaire et du montant total de la commande afin d'obtenir le montant total de la commande.

6. Après le calcul du total, affichage dans la console :

  • Utiliser thenAccept() pour traiter et afficher le résultat ;
  • Après avoir terminé tous les calculs, afficher le total de la commande dans la console.

Pour afficher le résultat dans la console, utilisez ce modèle :

System.out.println("Final total for " + orderId + ": " + finalTotal);

Si tout est fait correctement, vous obtiendrez cette sortie dans la console :

Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0

Une fois que vous avez vérifié que tout fonctionne, exécutez les tests de vérification sur le chemin /src/test/java/OrderProcessingExampleTest.java.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 7

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Suggested prompts:

Can you explain how to implement the asynchronous order processing in code?

What should the structure of the InitMap, OrderService, and CalculationService classes look like?

Can you walk me through an example of processing a single order step by step?

Awesome!

Completion rate improved to 3.33

bookDéfi : CompletableFuture

Glissez pour afficher le menu

Tâche

Votre tâche consiste à concevoir un système qui gère les commandes et effectue des calculs supplémentaires tels que les taxes et les frais de livraison. Il est nécessaire de traiter plusieurs commandes de manière asynchrone, d'effectuer les calculs requis, et d'afficher le montant total pour chaque commande une fois que tous les calculs sont terminés.

Chaque commande possède un identifiant unique et un prix qui lui est associé. (Classe InitMap)

Les ID et leurs montants sont stockés dans une Map au sein de la classe InitMap. Les clés de cette Map (qui correspondent aux ID de commande) sont celles sur lesquelles nous itérons dans la méthode processOrders().

La récupération des données de commande s'effectue de manière asynchrone et retourne le montant de la commande. Ceci est géré par la classe OrderService, en particulier par la méthode fetchOrderAmount(String orderId).

La taxe est calculée à 15% du montant de la commande. Cette opération est assurée par la classe CalculationService, via la méthode calculateTax().

Les frais de livraison sont calculés à 10% du montant de la commande. Ceci est également géré par la classe CalculationService, via la méthode calculateShipping().

Note
Remarque

Votre tâche principale consiste à implémenter la logique étape par étape dans la classe task du package OrderProcessingExample, dans la méthode processOrders().

Étapes d’implémentation

1. Recevoir le montant de la commande de manière asynchrone à l’aide du service de commande :

  • Créer un objet CompletableFuture pour récupérer le montant de la commande de façon asynchrone ;
  • Appeler la méthode fetchOrderAmount() de OrderService en passant l’identifiant de la commande.
Note
Remarque

La méthode fetchOrderAmount() utilise CompletableFuture.supplyAsync() pour exécuter la tâche de manière asynchrone et retourne le montant de la commande, selon son identifiant.

2. Après avoir récupéré le montant de la commande, calcul du taxe de manière asynchrone à l'aide du service de calcul :

  • Utiliser thenCompose() pour exécuter la tâche de façon séquentielle après l'obtention du montant de la commande. Appeler la méthode calculateTax() de CalculationService en passant le montant de la commande.
Note
Remarque

La méthode calculateTax() utilise CompletableFuture.supplyAsync() pour exécuter la tâche de manière asynchrone et retourne une taxe égale à 15 % du montant de la commande.

3. Après avoir reçu le montant de la commande, calcul asynchrone du coût d'expédition à l'aide du service de calcul :

  • Utiliser thenCompose() pour exécuter la tâche de manière séquentielle après la réception du montant de la commande. Appeler la méthode calculateShipping de CalculationService en passant le montant de la commande.
Note
Remarque

La méthode calculateShipping() utilise CompletableFuture.supplyAsync() pour exécuter la tâche de façon asynchrone et retourne un coût d'expédition égal à 10 % du montant de la commande.

4. Combinaison des calculs asynchrones de la taxe et du coût d'expédition pour obtenir le coût supplémentaire total :

  • Utiliser thenCombine() pour combiner les deux résultats CompletableFuture de la taxe et de l'expédition afin d'obtenir le coût supplémentaire total (taxe + coût d'expédition).

5. Combinaison du montant de la commande et du coût supplémentaire total pour obtenir le montant total de la commande :

  • Utiliser thenCombine() pour combiner les deux résultats CompletableFuture du coût supplémentaire et du montant total de la commande afin d'obtenir le montant total de la commande.

6. Après le calcul du total, affichage dans la console :

  • Utiliser thenAccept() pour traiter et afficher le résultat ;
  • Après avoir terminé tous les calculs, afficher le total de la commande dans la console.

Pour afficher le résultat dans la console, utilisez ce modèle :

System.out.println("Final total for " + orderId + ": " + finalTotal);

Si tout est fait correctement, vous obtiendrez cette sortie dans la console :

Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0

Une fois que vous avez vérifié que tout fonctionne, exécutez les tests de vérification sur le chemin /src/test/java/OrderProcessingExampleTest.java.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 7
some-alt