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

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

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