Desafío: CompletableFuture
Tarea
El objetivo es construir un sistema que gestione pedidos y realice cálculos adicionales como impuestos y costos de envío. Se requiere procesar múltiples pedidos de forma asíncrona, efectuar los cálculos necesarios y mostrar el monto total de cada pedido una vez que todas las operaciones hayan finalizado.
Cada pedido tiene un identificador único y un precio asociado. (Clase InitMap)
El ID y sus sumas se almacenan en un Map dentro de la clase InitMap. Las claves de este Map (que son los ID de los pedidos) son las que se recorren en el método processOrders().
La obtención de datos de los pedidos se realiza de forma asíncrona y devuelve el monto del pedido. Esto es gestionado por la clase OrderService, específicamente por el método fetchOrderAmount(String orderId).
El impuesto se calcula como el 15% del monto del pedido. Esto es gestionado por la clase CalculationService, utilizando el método calculateTax().
El costo de envío se calcula como el 10% del monto del pedido. Esto también es gestionado por la clase CalculationService, utilizando el método calculateShipping().
La tarea principal consiste en implementar la lógica paso a paso en el paquete task, clase OrderProcessingExample, en el método processOrders().
Pasos de implementación
1. Recibir el monto del pedido de forma asíncrona utilizando el servicio de pedidos:
- Crear un objeto
CompletableFuturepara obtener el monto del pedido de forma asíncrona; - Llamar al método
fetchOrderAmount()deOrderServicepasando el order id.
El método fetchOrderAmount() utiliza CompletableFuture.supplyAsync() para realizar la tarea de forma asíncrona y devuelve el monto del pedido, según su id.
2. Después de obtener el monto del pedido, calcular de forma asíncrona el impuesto utilizando el servicio de cálculo:
- Utilizar
thenCompose()para ejecutar la tarea de manera secuencial después de obtener el monto del pedido. Llamar al métodocalculateTax()deCalculationServicepasando el monto del pedido.
El método calculateTax() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y devuelve un impuesto igual al 15% del monto del pedido.
3. Después de recibir el monto del pedido, calcular de forma asíncrona el costo de envío utilizando el servicio de cálculo:
- Utilizar
thenCompose()para ejecutar la tarea secuencialmente después de recibir el monto del pedido. Llamar al métodocalculateShippingdeCalculationServicepasando el monto del pedido.
El método calculateShipping() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y retorna un costo de envío igual al 10% del monto del pedido.
4. Combinar los cálculos asíncronos de impuestos y costo de envío para obtener el costo incremental total:
- Utilizar
thenCombine()para combinar dos resultados deCompletableFuturede impuestos y envío para obtener el costo adicional total (impuestos + costo de envío).
5. Combinar el monto del pedido y el costo adicional total para obtener el monto total del pedido:
- Utilizar
thenCombine()para combinar los dos resultados deCompletableFuturede costo adicional y monto total adicional y monto total del pedido para obtener el monto total del pedido.
6. Después de calcular el total, mostrarlo en la consola:
- Utilizar
thenAccept()para procesar y mostrar el resultado; - Después de completar todos los cálculos, mostrar el total del pedido en la consola.
Para mostrar el resultado en la consola, se puede utilizar este patrón:
System.out.println("Final total for " + orderId + ": " + finalTotal);
Si se sigue todo correctamente, se obtendrá esta salida en la consola:
Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0
Una vez verificado que todo funciona correctamente, ejecutar las pruebas de verificación en la ruta /src/test/java/OrderProcessingExampleTest.java.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
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
Desafío: CompletableFuture
Desliza para mostrar el menú
Tarea
El objetivo es construir un sistema que gestione pedidos y realice cálculos adicionales como impuestos y costos de envío. Se requiere procesar múltiples pedidos de forma asíncrona, efectuar los cálculos necesarios y mostrar el monto total de cada pedido una vez que todas las operaciones hayan finalizado.
Cada pedido tiene un identificador único y un precio asociado. (Clase InitMap)
El ID y sus sumas se almacenan en un Map dentro de la clase InitMap. Las claves de este Map (que son los ID de los pedidos) son las que se recorren en el método processOrders().
La obtención de datos de los pedidos se realiza de forma asíncrona y devuelve el monto del pedido. Esto es gestionado por la clase OrderService, específicamente por el método fetchOrderAmount(String orderId).
El impuesto se calcula como el 15% del monto del pedido. Esto es gestionado por la clase CalculationService, utilizando el método calculateTax().
El costo de envío se calcula como el 10% del monto del pedido. Esto también es gestionado por la clase CalculationService, utilizando el método calculateShipping().
La tarea principal consiste en implementar la lógica paso a paso en el paquete task, clase OrderProcessingExample, en el método processOrders().
Pasos de implementación
1. Recibir el monto del pedido de forma asíncrona utilizando el servicio de pedidos:
- Crear un objeto
CompletableFuturepara obtener el monto del pedido de forma asíncrona; - Llamar al método
fetchOrderAmount()deOrderServicepasando el order id.
El método fetchOrderAmount() utiliza CompletableFuture.supplyAsync() para realizar la tarea de forma asíncrona y devuelve el monto del pedido, según su id.
2. Después de obtener el monto del pedido, calcular de forma asíncrona el impuesto utilizando el servicio de cálculo:
- Utilizar
thenCompose()para ejecutar la tarea de manera secuencial después de obtener el monto del pedido. Llamar al métodocalculateTax()deCalculationServicepasando el monto del pedido.
El método calculateTax() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y devuelve un impuesto igual al 15% del monto del pedido.
3. Después de recibir el monto del pedido, calcular de forma asíncrona el costo de envío utilizando el servicio de cálculo:
- Utilizar
thenCompose()para ejecutar la tarea secuencialmente después de recibir el monto del pedido. Llamar al métodocalculateShippingdeCalculationServicepasando el monto del pedido.
El método calculateShipping() utiliza CompletableFuture.supplyAsync() para ejecutar la tarea de forma asíncrona y retorna un costo de envío igual al 10% del monto del pedido.
4. Combinar los cálculos asíncronos de impuestos y costo de envío para obtener el costo incremental total:
- Utilizar
thenCombine()para combinar dos resultados deCompletableFuturede impuestos y envío para obtener el costo adicional total (impuestos + costo de envío).
5. Combinar el monto del pedido y el costo adicional total para obtener el monto total del pedido:
- Utilizar
thenCombine()para combinar los dos resultados deCompletableFuturede costo adicional y monto total adicional y monto total del pedido para obtener el monto total del pedido.
6. Después de calcular el total, mostrarlo en la consola:
- Utilizar
thenAccept()para procesar y mostrar el resultado; - Después de completar todos los cálculos, mostrar el total del pedido en la consola.
Para mostrar el resultado en la consola, se puede utilizar este patrón:
System.out.println("Final total for " + orderId + ": " + finalTotal);
Si se sigue todo correctamente, se obtendrá esta salida en la consola:
Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0
Una vez verificado que todo funciona correctamente, ejecutar las pruebas de verificación en la ruta /src/test/java/OrderProcessingExampleTest.java.
¡Gracias por tus comentarios!