Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Desafio: CompletableFuture | Melhores Práticas de Multithreading
Multithreading em Java

bookDesafio: 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().

Note
Nota

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 CompletableFuture para buscar o valor do pedido assíncronamente;
  • Chamar o método fetchOrderAmount() da classe OrderService passando o order id.
Note
Nota

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étodo calculateTax() da CalculationService passando o valor do pedido.
Note
Nota

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étodo calculateShipping da classe CalculationService, passando o valor do pedido.
Note
Nota

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 de CompletableFuture de 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 de CompletableFuture de 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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 7

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 3.33

bookDesafio: 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().

Note
Nota

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 CompletableFuture para buscar o valor do pedido assíncronamente;
  • Chamar o método fetchOrderAmount() da classe OrderService passando o order id.
Note
Nota

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étodo calculateTax() da CalculationService passando o valor do pedido.
Note
Nota

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étodo calculateShipping da classe CalculationService, passando o valor do pedido.
Note
Nota

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 de CompletableFuture de 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 de CompletableFuture de 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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 4. Capítulo 7
some-alt