Utmaning: CompletableFuture
Uppgift
Uppgiften är att bygga ett system som hanterar beställningar och utför ytterligare beräkningar såsom skatt och fraktkostnader. Du behöver behandla flera beställningar asynkront, utföra de nödvändiga beräkningarna och visa det totala beloppet för varje beställning när alla beräkningar är klara.
Varje beställning har en unik identifierare och ett pris kopplat till sig. (InitMap class)
ID och deras summor lagras i en Map i klassen InitMap. Nycklarna i denna Map (vilka är beställnings-ID) är de som vi itererar över i metoden processOrders().
Hämtning av beställningsdata sker asynkront och returnerar beställningsbeloppet. Detta hanteras av klassen OrderService, specifikt metoden fetchOrderAmount(String orderId).
Skatt beräknas som 15 % av beställningsbeloppet. Detta hanteras av klassen CalculationService med hjälp av metoden calculateTax().
Fraktkostnaden beräknas som 10 % av beställningsbeloppet. Detta hanteras också av klassen CalculationService med hjälp av metoden calculateShipping().
Din huvuduppgift är att stegvis implementera logiken i paketet task klassen OrderProcessingExample i metoden processOrders().
Implementeringssteg
1. Ta emot orderbeloppet asynkront med hjälp av ordertjänsten:
- Skapa ett
CompletableFuture-objekt för att hämta orderbeloppet asynkront; - Anropa metoden
fetchOrderAmount()frånOrderServiceoch skicka med order id.
Metoden fetchOrderAmount() använder CompletableFuture.supplyAsync() för att utföra uppgiften asynkront och returnerar orderbeloppet baserat på dess id.
2. Efter att ha hämtat orderbeloppet, beräkna asynkront skatten med hjälp av beräkningstjänsten:
- Använd
thenCompose()för att utföra uppgiften sekventiellt efter att ha erhållit orderbeloppet. Anropa metodencalculateTax()frånCalculationServiceoch skicka med orderbeloppet.
Metoden calculateTax() använder CompletableFuture.supplyAsync() för att utföra uppgiften asynkront och returnerar en skatt som motsvarar 15 % av orderbeloppet.
3. Efter att ha mottagit orderbeloppet, beräkna fraktkostnaden asynkront med hjälp av calculate-tjänsten:
- Använd
thenCompose()för att utföra uppgiften sekventiellt efter att orderbeloppet mottagits. Anropa metodencalculateShippingfrånCalculationServiceoch skicka med orderbeloppet.
Metoden calculateShipping() använder CompletableFuture.supplyAsync() för att utföra uppgiften asynkront och returnerar en fraktkostnad som motsvarar 10% av orderbeloppet.
4. Kombinera asynkrona beräkningar av skatt och fraktkostnad för att få den totala tillkommande kostnaden:
- Använd
thenCombine()för att kombinera tvåCompletableFuture-resultat av skatt och frakt för att få den totala tillkommande kostnaden (skatt + fraktkostnad).
5. Kombinera orderbeloppet och den totala tillkommande kostnaden för att få det totala orderbeloppet:
- Använd
thenCombine()för att kombinera de tvåCompletableFuture-resultaten av tillkommande kostnad och totalt orderbelopp för att få det totala orderbeloppet.
6. Efter att ha beräknat totalen, skriv ut den till konsolen:
- Använd
thenAccept()för att bearbeta och skriva ut resultatet; - Efter att alla beräkningar är klara, skriv ut ordertotalen till konsolen.
För att skriva ut resultatet till konsolen kan du använda detta mönster:
System.out.println("Final total for " + orderId + ": " + finalTotal);
Om du följer allt korrekt kommer du få detta utdata till konsolen:
Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0
När du är säker på att allt fungerar, kör verifieringstesterna på sökvägen /src/test/java/OrderProcessingExampleTest.java.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 3.33
Utmaning: CompletableFuture
Svep för att visa menyn
Uppgift
Uppgiften är att bygga ett system som hanterar beställningar och utför ytterligare beräkningar såsom skatt och fraktkostnader. Du behöver behandla flera beställningar asynkront, utföra de nödvändiga beräkningarna och visa det totala beloppet för varje beställning när alla beräkningar är klara.
Varje beställning har en unik identifierare och ett pris kopplat till sig. (InitMap class)
ID och deras summor lagras i en Map i klassen InitMap. Nycklarna i denna Map (vilka är beställnings-ID) är de som vi itererar över i metoden processOrders().
Hämtning av beställningsdata sker asynkront och returnerar beställningsbeloppet. Detta hanteras av klassen OrderService, specifikt metoden fetchOrderAmount(String orderId).
Skatt beräknas som 15 % av beställningsbeloppet. Detta hanteras av klassen CalculationService med hjälp av metoden calculateTax().
Fraktkostnaden beräknas som 10 % av beställningsbeloppet. Detta hanteras också av klassen CalculationService med hjälp av metoden calculateShipping().
Din huvuduppgift är att stegvis implementera logiken i paketet task klassen OrderProcessingExample i metoden processOrders().
Implementeringssteg
1. Ta emot orderbeloppet asynkront med hjälp av ordertjänsten:
- Skapa ett
CompletableFuture-objekt för att hämta orderbeloppet asynkront; - Anropa metoden
fetchOrderAmount()frånOrderServiceoch skicka med order id.
Metoden fetchOrderAmount() använder CompletableFuture.supplyAsync() för att utföra uppgiften asynkront och returnerar orderbeloppet baserat på dess id.
2. Efter att ha hämtat orderbeloppet, beräkna asynkront skatten med hjälp av beräkningstjänsten:
- Använd
thenCompose()för att utföra uppgiften sekventiellt efter att ha erhållit orderbeloppet. Anropa metodencalculateTax()frånCalculationServiceoch skicka med orderbeloppet.
Metoden calculateTax() använder CompletableFuture.supplyAsync() för att utföra uppgiften asynkront och returnerar en skatt som motsvarar 15 % av orderbeloppet.
3. Efter att ha mottagit orderbeloppet, beräkna fraktkostnaden asynkront med hjälp av calculate-tjänsten:
- Använd
thenCompose()för att utföra uppgiften sekventiellt efter att orderbeloppet mottagits. Anropa metodencalculateShippingfrånCalculationServiceoch skicka med orderbeloppet.
Metoden calculateShipping() använder CompletableFuture.supplyAsync() för att utföra uppgiften asynkront och returnerar en fraktkostnad som motsvarar 10% av orderbeloppet.
4. Kombinera asynkrona beräkningar av skatt och fraktkostnad för att få den totala tillkommande kostnaden:
- Använd
thenCombine()för att kombinera tvåCompletableFuture-resultat av skatt och frakt för att få den totala tillkommande kostnaden (skatt + fraktkostnad).
5. Kombinera orderbeloppet och den totala tillkommande kostnaden för att få det totala orderbeloppet:
- Använd
thenCombine()för att kombinera de tvåCompletableFuture-resultaten av tillkommande kostnad och totalt orderbelopp för att få det totala orderbeloppet.
6. Efter att ha beräknat totalen, skriv ut den till konsolen:
- Använd
thenAccept()för att bearbeta och skriva ut resultatet; - Efter att alla beräkningar är klara, skriv ut ordertotalen till konsolen.
För att skriva ut resultatet till konsolen kan du använda detta mönster:
System.out.println("Final total for " + orderId + ": " + finalTotal);
Om du följer allt korrekt kommer du få detta utdata till konsolen:
Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0
När du är säker på att allt fungerar, kör verifieringstesterna på sökvägen /src/test/java/OrderProcessingExampleTest.java.
Tack för dina kommentarer!