Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Utfordring: CompletableFuture | Beste Praksiser for Multitråding
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Multitråding i Java

bookUtfordring: CompletableFuture

Oppgave

Oppgaven er å bygge et system som håndterer ordre og utfører tilleggsberegninger som skatt og fraktkostnader. Det kreves å behandle flere ordre asynkront, utføre de nødvendige beregningene, og vise totalbeløpet for hver ordre når alle beregninger er fullført.

Hver ordre har en unik identifikator og en pris tilknyttet. (InitMap-klassen)

ID-ene og deres summer lagres i en Map i InitMap klassen. Nøklene i denne Map (som er ordre-ID) er de som det itereres over i processOrders()-metoden.

Henting av ordredato skjer asynkront og returnerer ordrebeløpet. Dette håndteres av OrderService-klassen, spesielt metoden fetchOrderAmount(String orderId).

Skatt beregnes som 15 % av ordrebeløpet. Dette håndteres av CalculationService-klassen ved bruk av metoden calculateTax().

Fraktkostnad beregnes som 10 % av ordrebeløpet. Dette håndteres også av CalculationService-klassen ved bruk av metoden calculateShipping().

Note
Merk

Din hovedoppgave er å implementere logikken steg for steg i pakken task klassen OrderProcessingExample i metoden processOrders().

Implementeringstrinn

1. Motta ordrebeløpet asynkront ved å bruke ordre-tjenesten:

  • Opprett et CompletableFuture-objekt for å hente ordrebeløpet asynkront;
  • Kall metoden fetchOrderAmount() fra OrderService og send inn order id.
Note
Merk

Metoden fetchOrderAmount() bruker CompletableFuture.supplyAsync() for å utføre oppgaven asynkront og returnerer ordrebeløpet basert på id.

2. Etter å ha hentet ordrebeløpet, beregn skatt asynkront ved å bruke kalkulasjonstjenesten:

  • Bruk thenCompose() for å utføre oppgaven sekvensielt etter å ha mottatt ordrebeløpet. Kall metoden calculateTax() fra CalculationService og send inn ordrebeløpet.
Note
Merk

Metoden calculateTax() bruker CompletableFuture.supplyAsync() for å utføre oppgaven asynkront og returnerer en skatt lik 15 % av ordrebeløpet.

3. Etter å ha mottatt ordrebeløpet, beregn fraktkostnaden asynkront ved å bruke beregningstjenesten:

  • Bruk thenCompose() for å utføre oppgaven sekvensielt etter at ordrebeløpet er mottatt. Kall metoden calculateShipping fra CalculationService og send inn ordrebeløpet.
Note
Merk

Metoden calculateShipping() bruker CompletableFuture.supplyAsync() for å utføre oppgaven asynkront og returnerer en fraktkostnad lik 10 % av ordrebeløpet.

4. Kombiner asynkrone beregninger av skatt og fraktkostnad for å få den totale tilleggskostnaden:

  • Bruk thenCombine() for å kombinere to CompletableFuture-resultater for skatt og frakt for å få den totale tilleggskostnaden (skatt + fraktkostnad).

5. Kombiner ordrebeløpet og den totale tilleggskostnaden for å få det totale ordrebeløpet:

  • Bruk thenCombine() for å kombinere de to CompletableFuture-resultatene for tilleggskostnad og totalt ordrebeløp for å få det totale ordrebeløpet.

6. Etter å ha beregnet totalen, skriv den ut til konsollen:

  • Bruk thenAccept() for å behandle og skrive ut resultatet;
  • Etter at alle beregninger er fullført, skriv ut ordretotalen til konsollen.

For å skrive ut resultatet til konsollen, kan du bruke dette mønsteret:

System.out.println("Final total for " + orderId + ": " + finalTotal);

Hvis du følger alt korrekt, vil du få denne utdataen til konsollen:

Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0

Når du er sikker på at alt fungerer, kjør verifikasjonstestene på banen /src/test/java/OrderProcessingExampleTest.java.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 7

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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?

bookUtfordring: CompletableFuture

Sveip for å vise menyen

Oppgave

Oppgaven er å bygge et system som håndterer ordre og utfører tilleggsberegninger som skatt og fraktkostnader. Det kreves å behandle flere ordre asynkront, utføre de nødvendige beregningene, og vise totalbeløpet for hver ordre når alle beregninger er fullført.

Hver ordre har en unik identifikator og en pris tilknyttet. (InitMap-klassen)

ID-ene og deres summer lagres i en Map i InitMap klassen. Nøklene i denne Map (som er ordre-ID) er de som det itereres over i processOrders()-metoden.

Henting av ordredato skjer asynkront og returnerer ordrebeløpet. Dette håndteres av OrderService-klassen, spesielt metoden fetchOrderAmount(String orderId).

Skatt beregnes som 15 % av ordrebeløpet. Dette håndteres av CalculationService-klassen ved bruk av metoden calculateTax().

Fraktkostnad beregnes som 10 % av ordrebeløpet. Dette håndteres også av CalculationService-klassen ved bruk av metoden calculateShipping().

Note
Merk

Din hovedoppgave er å implementere logikken steg for steg i pakken task klassen OrderProcessingExample i metoden processOrders().

Implementeringstrinn

1. Motta ordrebeløpet asynkront ved å bruke ordre-tjenesten:

  • Opprett et CompletableFuture-objekt for å hente ordrebeløpet asynkront;
  • Kall metoden fetchOrderAmount() fra OrderService og send inn order id.
Note
Merk

Metoden fetchOrderAmount() bruker CompletableFuture.supplyAsync() for å utføre oppgaven asynkront og returnerer ordrebeløpet basert på id.

2. Etter å ha hentet ordrebeløpet, beregn skatt asynkront ved å bruke kalkulasjonstjenesten:

  • Bruk thenCompose() for å utføre oppgaven sekvensielt etter å ha mottatt ordrebeløpet. Kall metoden calculateTax() fra CalculationService og send inn ordrebeløpet.
Note
Merk

Metoden calculateTax() bruker CompletableFuture.supplyAsync() for å utføre oppgaven asynkront og returnerer en skatt lik 15 % av ordrebeløpet.

3. Etter å ha mottatt ordrebeløpet, beregn fraktkostnaden asynkront ved å bruke beregningstjenesten:

  • Bruk thenCompose() for å utføre oppgaven sekvensielt etter at ordrebeløpet er mottatt. Kall metoden calculateShipping fra CalculationService og send inn ordrebeløpet.
Note
Merk

Metoden calculateShipping() bruker CompletableFuture.supplyAsync() for å utføre oppgaven asynkront og returnerer en fraktkostnad lik 10 % av ordrebeløpet.

4. Kombiner asynkrone beregninger av skatt og fraktkostnad for å få den totale tilleggskostnaden:

  • Bruk thenCombine() for å kombinere to CompletableFuture-resultater for skatt og frakt for å få den totale tilleggskostnaden (skatt + fraktkostnad).

5. Kombiner ordrebeløpet og den totale tilleggskostnaden for å få det totale ordrebeløpet:

  • Bruk thenCombine() for å kombinere de to CompletableFuture-resultatene for tilleggskostnad og totalt ordrebeløp for å få det totale ordrebeløpet.

6. Etter å ha beregnet totalen, skriv den ut til konsollen:

  • Bruk thenAccept() for å behandle og skrive ut resultatet;
  • Etter at alle beregninger er fullført, skriv ut ordretotalen til konsollen.

For å skrive ut resultatet til konsollen, kan du bruke dette mønsteret:

System.out.println("Final total for " + orderId + ": " + finalTotal);

Hvis du følger alt korrekt, vil du få denne utdataen til konsollen:

Final total for order2: 150.0
Final total for order1: 375.0
Final total for order3: 225.0

Når du er sikker på at alt fungerer, kjør verifikasjonstestene på banen /src/test/java/OrderProcessingExampleTest.java.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 4. Kapittel 7
some-alt