Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Haaste: CompletableFuture | Monisäikeisyyden Parhaat Käytännöt
Monisäikeisyys Javassa

bookHaaste: CompletableFuture

Tehtävä

Tavoitteena on rakentaa järjestelmä, joka käsittelee tilauksia ja suorittaa lisälaskelmia kuten veron ja toimituskulujen laskemisen. Tulee käsitellä useita tilauksia asynkronisesti, suorittaa tarvittavat laskelmat ja näyttää tilauksen kokonaissumma, kun kaikki laskelmat ovat valmiit.

Jokaisella tilauksella on yksilöllinen tunniste ja siihen liittyvä hinta. (InitMap-luokka)

ID ja niiden summat tallennetaan Map-rakenteeseen InitMap-luokassa. Tämän Map-rakenteen avaimet (eli tilauksen ID) käydään läpi processOrders()-metodissa.

Tilaustietojen haku tapahtuu asynkronisesti ja palauttaa tilauksen summan. Tämän hoitaa OrderService-luokka, erityisesti fetchOrderAmount(String orderId)-metodi.

Vero lasketaan 15 % tilauksen summasta. Tämän hoitaa CalculationService-luokka käyttäen calculateTax()-metodia.

Toimituskulut lasketaan 10 % tilauksen summasta. Tämäkin hoidetaan CalculationService-luokassa käyttäen calculateShipping()-metodia.

Note
Huomio

Päätehtäväsi on toteuttaa logiikka vaihe vaiheelta paketissa task luokassa OrderProcessingExample metodissa processOrders().

Toteutusvaiheet

1. Vastaanota tilauksen summa asynkronisesti käyttämällä tilausten palvelua:

  • Luo CompletableFuture-olio hakeaksesi tilauksen summan asynkronisesti;
  • Kutsu fetchOrderAmount()-metodia luokasta OrderService välittäen order id.
Note
Huomio

fetchOrderAmount()-metodi käyttää CompletableFuture.supplyAsync()-metodia suorittaakseen tehtävän asynkronisesti ja palauttaa tilauksen summan sen id:n perusteella.

2. Tilauksen summan hakemisen jälkeen laske vero asynkronisesti laskentapalvelun avulla:

  • Käytä thenCompose()-metodia suorittaaksesi tehtävän peräkkäin tilauksen summan saamisen jälkeen. Kutsu calculateTax()-luokan CalculationService-metodia ja välitä tilauksen summa.
Note
Huomio

calculateTax()-metodi käyttää CompletableFuture.supplyAsync()-metodia suorittaakseen tehtävän asynkronisesti ja palauttaa veron, joka on 15 % tilauksen summasta.

3. Kun tilauksen summa on saatu, laske toimituskulut asynkronisesti laskentapalvelun avulla:

  • Käytä thenCompose()-metodia suorittaaksesi tehtävän peräkkäin tilauksen summan saamisen jälkeen. Kutsu calculateShipping-luokan CalculationService-metodia ja välitä tilauksen summa.
Note
Huomio

calculateShipping()-metodi käyttää CompletableFuture.supplyAsync()-metodia suorittaakseen tehtävän asynkronisesti ja palauttaa toimituskulun, joka on 10 % tilauksen summasta.

4. Yhdistä asynkroniset veron ja toimituskulujen laskut saadaksesi kokonaislisäkustannuksen:

  • Käytä thenCombine()-metodia yhdistääksesi kahden CompletableFuture-tuloksen veroista ja toimituskuluista saadaksesi kokonaislisäkustannuksen (vero + toimituskulut).

5. Yhdistä tilauksen summa ja kokonaislisäkustannus saadaksesi tilauksen kokonaissumman:

  • Käytä thenCombine()-metodia yhdistääksesi kahden CompletableFuture-tuloksen lisäkustannuksista ja kokonaissummasta saadaksesi tilauksen kokonaissumman.

6. Kun kokonaissumma on laskettu, tulosta se konsoliin:

  • Käytä thenAccept()-metodia tuloksen käsittelyyn ja tulostamiseen;
  • Kun kaikki laskelmat on suoritettu, tulosta tilauksen kokonaissumma konsoliin.

Tulostaaksesi tuloksen konsoliin, voit käyttää tätä mallia:

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

Jos noudatat kaikkea oikein, saat seuraavan tulosteen konsoliin:

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

Kun olet varma, että kaikki toimii, suorita varmennustestit polussa /src/test/java/OrderProcessingExampleTest.java.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 7

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Awesome!

Completion rate improved to 3.33

bookHaaste: CompletableFuture

Pyyhkäise näyttääksesi valikon

Tehtävä

Tavoitteena on rakentaa järjestelmä, joka käsittelee tilauksia ja suorittaa lisälaskelmia kuten veron ja toimituskulujen laskemisen. Tulee käsitellä useita tilauksia asynkronisesti, suorittaa tarvittavat laskelmat ja näyttää tilauksen kokonaissumma, kun kaikki laskelmat ovat valmiit.

Jokaisella tilauksella on yksilöllinen tunniste ja siihen liittyvä hinta. (InitMap-luokka)

ID ja niiden summat tallennetaan Map-rakenteeseen InitMap-luokassa. Tämän Map-rakenteen avaimet (eli tilauksen ID) käydään läpi processOrders()-metodissa.

Tilaustietojen haku tapahtuu asynkronisesti ja palauttaa tilauksen summan. Tämän hoitaa OrderService-luokka, erityisesti fetchOrderAmount(String orderId)-metodi.

Vero lasketaan 15 % tilauksen summasta. Tämän hoitaa CalculationService-luokka käyttäen calculateTax()-metodia.

Toimituskulut lasketaan 10 % tilauksen summasta. Tämäkin hoidetaan CalculationService-luokassa käyttäen calculateShipping()-metodia.

Note
Huomio

Päätehtäväsi on toteuttaa logiikka vaihe vaiheelta paketissa task luokassa OrderProcessingExample metodissa processOrders().

Toteutusvaiheet

1. Vastaanota tilauksen summa asynkronisesti käyttämällä tilausten palvelua:

  • Luo CompletableFuture-olio hakeaksesi tilauksen summan asynkronisesti;
  • Kutsu fetchOrderAmount()-metodia luokasta OrderService välittäen order id.
Note
Huomio

fetchOrderAmount()-metodi käyttää CompletableFuture.supplyAsync()-metodia suorittaakseen tehtävän asynkronisesti ja palauttaa tilauksen summan sen id:n perusteella.

2. Tilauksen summan hakemisen jälkeen laske vero asynkronisesti laskentapalvelun avulla:

  • Käytä thenCompose()-metodia suorittaaksesi tehtävän peräkkäin tilauksen summan saamisen jälkeen. Kutsu calculateTax()-luokan CalculationService-metodia ja välitä tilauksen summa.
Note
Huomio

calculateTax()-metodi käyttää CompletableFuture.supplyAsync()-metodia suorittaakseen tehtävän asynkronisesti ja palauttaa veron, joka on 15 % tilauksen summasta.

3. Kun tilauksen summa on saatu, laske toimituskulut asynkronisesti laskentapalvelun avulla:

  • Käytä thenCompose()-metodia suorittaaksesi tehtävän peräkkäin tilauksen summan saamisen jälkeen. Kutsu calculateShipping-luokan CalculationService-metodia ja välitä tilauksen summa.
Note
Huomio

calculateShipping()-metodi käyttää CompletableFuture.supplyAsync()-metodia suorittaakseen tehtävän asynkronisesti ja palauttaa toimituskulun, joka on 10 % tilauksen summasta.

4. Yhdistä asynkroniset veron ja toimituskulujen laskut saadaksesi kokonaislisäkustannuksen:

  • Käytä thenCombine()-metodia yhdistääksesi kahden CompletableFuture-tuloksen veroista ja toimituskuluista saadaksesi kokonaislisäkustannuksen (vero + toimituskulut).

5. Yhdistä tilauksen summa ja kokonaislisäkustannus saadaksesi tilauksen kokonaissumman:

  • Käytä thenCombine()-metodia yhdistääksesi kahden CompletableFuture-tuloksen lisäkustannuksista ja kokonaissummasta saadaksesi tilauksen kokonaissumman.

6. Kun kokonaissumma on laskettu, tulosta se konsoliin:

  • Käytä thenAccept()-metodia tuloksen käsittelyyn ja tulostamiseen;
  • Kun kaikki laskelmat on suoritettu, tulosta tilauksen kokonaissumma konsoliin.

Tulostaaksesi tuloksen konsoliin, voit käyttää tätä mallia:

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

Jos noudatat kaikkea oikein, saat seuraavan tulosteen konsoliin:

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

Kun olet varma, että kaikki toimii, suorita varmennustestit polussa /src/test/java/OrderProcessingExampleTest.java.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 7
some-alt