Desafio: CompletableFuture
Tarefa
O objetivo é construir um sistema que gerencie pedidos e realize cálculos adicionais como impostos e custos de envio. É necessário processar múltiplos pedidos de forma assíncrona, executar os cálculos necessários e exibir o valor total de cada pedido assim que todos os cálculos forem concluídos.
Cada pedido possui um identificador único e um preço associado. (Classe InitMap)
O ID e seus valores são armazenados em um Map dentro da classe InitMap. As chaves desse Map (que são os ID dos pedidos) são aquelas percorridas no método processOrders().
A obtenção dos dados do pedido é feita de forma assíncrona e retorna o valor do pedido. Isso é tratado pela classe OrderService, especificamente pelo método fetchOrderAmount(String orderId).
O imposto é calculado como 15% do valor do pedido. Isso é gerenciado pela classe CalculationService, utilizando o método calculateTax().
O custo de envio é calculado como 10% do valor do pedido. Isso também é tratado pela classe CalculationService, utilizando o método calculateShipping().
A tarefa principal consiste em implementar a lógica passo a passo no pacote task, classe OrderProcessingExample, no método processOrders().
Etapas de Implementação
1. Receber o valor do pedido de forma assíncrona utilizando o serviço de pedidos:
- Criar um objeto
CompletableFuturepara buscar o valor do pedido assíncronamente; - Chamar o método
fetchOrderAmount()da classeOrderServicepassando o order id.
O método fetchOrderAmount() utiliza CompletableFuture.supplyAsync() para executar a tarefa de forma assíncrona e retorna o valor do pedido, pelo seu id.
2. Após obter o valor do pedido, calcular de forma assíncrona o imposto utilizando o serviço de cálculo:
- Utilizar
thenCompose()para executar a tarefa sequencialmente após obter o valor do pedido. Chamar o métodocalculateTax()daCalculationServicepassando o valor do pedido.
O método calculateTax() utiliza CompletableFuture.supplyAsync() para executar a tarefa de forma assíncrona e retorna um imposto igual a 15% do valor do pedido.
3. Após receber o valor do pedido, calcular o custo de envio de forma assíncrona utilizando o serviço de cálculo:
- Utilizar
thenCompose()para executar a tarefa sequencialmente após receber o valor do pedido. Chamar o métodocalculateShippingda classeCalculationService, passando o valor do pedido.
O método calculateShipping() utiliza CompletableFuture.supplyAsync() para executar a tarefa de forma assíncrona e retorna um custo de envio igual a 10% do valor do pedido.
4. Combinar os cálculos assíncronos de imposto e custo de envio para obter o custo incremental total:
- Utilizar
thenCombine()para combinar dois resultados deCompletableFuturede imposto e envio para obter o custo adicional total (imposto + custo de envio).
5. Combinar o valor do pedido e o custo adicional total para obter o valor total do pedido:
- Utilizar
thenCombine()para combinar os dois resultados deCompletableFuturede custo adicional e valor total adicional e valor total do pedido para obter o valor total do pedido.
6. Após calcular o total, exibir no console:
- Utilizar
thenAccept()para processar e exibir o resultado; - Após concluir todos os cálculos, exibir o total do pedido no console.
Para exibir o resultado no console, utilize este padrão:
System.out.println("Final total for " + orderId + ": " + finalTotal);
Se tudo for seguido corretamente, você obterá esta saída no console:
Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0
Após confirmar que tudo está funcionando, execute os testes de verificação no caminho /src/test/java/OrderProcessingExampleTest.java.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 3.33
Desafio: CompletableFuture
Deslize para mostrar o menu
Tarefa
O objetivo é construir um sistema que gerencie pedidos e realize cálculos adicionais como impostos e custos de envio. É necessário processar múltiplos pedidos de forma assíncrona, executar os cálculos necessários e exibir o valor total de cada pedido assim que todos os cálculos forem concluídos.
Cada pedido possui um identificador único e um preço associado. (Classe InitMap)
O ID e seus valores são armazenados em um Map dentro da classe InitMap. As chaves desse Map (que são os ID dos pedidos) são aquelas percorridas no método processOrders().
A obtenção dos dados do pedido é feita de forma assíncrona e retorna o valor do pedido. Isso é tratado pela classe OrderService, especificamente pelo método fetchOrderAmount(String orderId).
O imposto é calculado como 15% do valor do pedido. Isso é gerenciado pela classe CalculationService, utilizando o método calculateTax().
O custo de envio é calculado como 10% do valor do pedido. Isso também é tratado pela classe CalculationService, utilizando o método calculateShipping().
A tarefa principal consiste em implementar a lógica passo a passo no pacote task, classe OrderProcessingExample, no método processOrders().
Etapas de Implementação
1. Receber o valor do pedido de forma assíncrona utilizando o serviço de pedidos:
- Criar um objeto
CompletableFuturepara buscar o valor do pedido assíncronamente; - Chamar o método
fetchOrderAmount()da classeOrderServicepassando o order id.
O método fetchOrderAmount() utiliza CompletableFuture.supplyAsync() para executar a tarefa de forma assíncrona e retorna o valor do pedido, pelo seu id.
2. Após obter o valor do pedido, calcular de forma assíncrona o imposto utilizando o serviço de cálculo:
- Utilizar
thenCompose()para executar a tarefa sequencialmente após obter o valor do pedido. Chamar o métodocalculateTax()daCalculationServicepassando o valor do pedido.
O método calculateTax() utiliza CompletableFuture.supplyAsync() para executar a tarefa de forma assíncrona e retorna um imposto igual a 15% do valor do pedido.
3. Após receber o valor do pedido, calcular o custo de envio de forma assíncrona utilizando o serviço de cálculo:
- Utilizar
thenCompose()para executar a tarefa sequencialmente após receber o valor do pedido. Chamar o métodocalculateShippingda classeCalculationService, passando o valor do pedido.
O método calculateShipping() utiliza CompletableFuture.supplyAsync() para executar a tarefa de forma assíncrona e retorna um custo de envio igual a 10% do valor do pedido.
4. Combinar os cálculos assíncronos de imposto e custo de envio para obter o custo incremental total:
- Utilizar
thenCombine()para combinar dois resultados deCompletableFuturede imposto e envio para obter o custo adicional total (imposto + custo de envio).
5. Combinar o valor do pedido e o custo adicional total para obter o valor total do pedido:
- Utilizar
thenCombine()para combinar os dois resultados deCompletableFuturede custo adicional e valor total adicional e valor total do pedido para obter o valor total do pedido.
6. Após calcular o total, exibir no console:
- Utilizar
thenAccept()para processar e exibir o resultado; - Após concluir todos os cálculos, exibir o total do pedido no console.
Para exibir o resultado no console, utilize este padrão:
System.out.println("Final total for " + orderId + ": " + finalTotal);
Se tudo for seguido corretamente, você obterá esta saída no console:
Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0
Após confirmar que tudo está funcionando, execute os testes de verificação no caminho /src/test/java/OrderProcessingExampleTest.java.
Obrigado pelo seu feedback!