Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Sfida: CompletableFuture | Migliori Pratiche per il Multithreading
Quizzes & Challenges
Quizzes
Challenges
/
Multithreading in Java

bookSfida: CompletableFuture

Compito

Il compito consiste nel costruire un sistema che gestisca gli ordini ed esegua calcoli aggiuntivi come tasse e costi di spedizione. È necessario elaborare più ordini in modo asincrono, effettuare i calcoli necessari e visualizzare l'importo totale per ciascun ordine una volta che tutti i calcoli sono stati completati.

Ogni ordine ha un identificatore univoco e un prezzo associato. (Classe InitMap)

L'ID e le relative somme sono memorizzati in una Map all'interno della classe InitMap. Le chiavi di questa Map (che rappresentano gli ID degli ordini) sono quelle su cui si itera nel metodo processOrders().

Il recupero dei dati dell'ordine avviene in modo asincrono e restituisce l'importo dell'ordine. Questo è gestito dalla classe OrderService, in particolare dal metodo fetchOrderAmount(String orderId).

La tassa viene calcolata come 15% dell'importo dell'ordine. Questo è gestito dalla classe CalculationService, utilizzando il metodo calculateTax().

Il costo di spedizione viene calcolato come 10% dell'importo dell'ordine. Anche questo è gestito dalla classe CalculationService, utilizzando il metodo calculateShipping().

Note
Nota

Il compito principale consiste nell'implementare la logica passo dopo passo nel package task, classe OrderProcessingExample, nel metodo processOrders().

Passaggi di implementazione

1. Ricezione asincrona dell'importo dell'ordine tramite il servizio ordini:

  • Creazione di un oggetto CompletableFuture per recuperare l'importo dell'ordine in modo asincrono;
  • Chiamata al metodo fetchOrderAmount() di OrderService passando l'order id.
Note
Nota

Il metodo fetchOrderAmount() utilizza CompletableFuture.supplyAsync() per eseguire il compito in modo asincrono e restituisce l'importo dell'ordine, tramite il suo id.

2. Dopo aver recuperato l'importo dell'ordine, calcolare asincronamente la tassa utilizzando il servizio di calcolo:

  • Utilizzare thenCompose() per eseguire il compito in modo sequenziale dopo aver ottenuto l'importo dell'ordine. Chiamare il metodo calculateTax() di CalculationService passando l'importo dell'ordine.
Note
Nota

Il metodo calculateTax() utilizza CompletableFuture.supplyAsync() per eseguire il compito in modo asincrono e restituisce una tassa pari al 15% dell'importo dell'ordine.

3. Dopo aver ricevuto l'importo dell'ordine, calcolare asincronamente il costo di spedizione utilizzando il servizio di calcolo:

  • Utilizzare thenCompose() per eseguire il task in modo sequenziale dopo aver ricevuto l'importo dell'ordine. Chiamare il metodo calculateShipping della classe CalculationService passando l'importo dell'ordine.
Note
Nota

Il metodo calculateShipping() utilizza CompletableFuture.supplyAsync() per eseguire il task in modo asincrono e restituisce un costo di spedizione pari al 10% dell'importo dell'ordine.

4. Combinare i calcoli asincroni di tasse e costo di spedizione per ottenere il costo incrementale totale:

  • Utilizzare thenCombine() per combinare i risultati di due CompletableFuture di tasse e spedizione per ottenere il costo aggiuntivo totale (tasse + costo di spedizione).

5. Combinare l'importo dell'ordine e il costo aggiuntivo totale per ottenere l'importo totale dell'ordine:

  • Utilizzare thenCombine() per combinare i due risultati di CompletableFuture di costo aggiuntivo e importo totale per ottenere l'importo totale dell'ordine.

6. Dopo aver calcolato il totale, stamparlo sulla console:

  • Utilizzare thenAccept() per elaborare e stampare il risultato;
  • Dopo aver completato tutti i calcoli, stampare il totale dell'ordine sulla console.

Per visualizzare il risultato sulla console, è possibile utilizzare questo schema:

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

Se tutte le operazioni vengono eseguite correttamente, si otterrà questo output sulla console:

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

Una volta verificato che tutto funzioni, eseguire i test di verifica nel percorso /src/test/java/OrderProcessingExampleTest.java.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 7

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 3.33

bookSfida: CompletableFuture

Scorri per mostrare il menu

Compito

Il compito consiste nel costruire un sistema che gestisca gli ordini ed esegua calcoli aggiuntivi come tasse e costi di spedizione. È necessario elaborare più ordini in modo asincrono, effettuare i calcoli necessari e visualizzare l'importo totale per ciascun ordine una volta che tutti i calcoli sono stati completati.

Ogni ordine ha un identificatore univoco e un prezzo associato. (Classe InitMap)

L'ID e le relative somme sono memorizzati in una Map all'interno della classe InitMap. Le chiavi di questa Map (che rappresentano gli ID degli ordini) sono quelle su cui si itera nel metodo processOrders().

Il recupero dei dati dell'ordine avviene in modo asincrono e restituisce l'importo dell'ordine. Questo è gestito dalla classe OrderService, in particolare dal metodo fetchOrderAmount(String orderId).

La tassa viene calcolata come 15% dell'importo dell'ordine. Questo è gestito dalla classe CalculationService, utilizzando il metodo calculateTax().

Il costo di spedizione viene calcolato come 10% dell'importo dell'ordine. Anche questo è gestito dalla classe CalculationService, utilizzando il metodo calculateShipping().

Note
Nota

Il compito principale consiste nell'implementare la logica passo dopo passo nel package task, classe OrderProcessingExample, nel metodo processOrders().

Passaggi di implementazione

1. Ricezione asincrona dell'importo dell'ordine tramite il servizio ordini:

  • Creazione di un oggetto CompletableFuture per recuperare l'importo dell'ordine in modo asincrono;
  • Chiamata al metodo fetchOrderAmount() di OrderService passando l'order id.
Note
Nota

Il metodo fetchOrderAmount() utilizza CompletableFuture.supplyAsync() per eseguire il compito in modo asincrono e restituisce l'importo dell'ordine, tramite il suo id.

2. Dopo aver recuperato l'importo dell'ordine, calcolare asincronamente la tassa utilizzando il servizio di calcolo:

  • Utilizzare thenCompose() per eseguire il compito in modo sequenziale dopo aver ottenuto l'importo dell'ordine. Chiamare il metodo calculateTax() di CalculationService passando l'importo dell'ordine.
Note
Nota

Il metodo calculateTax() utilizza CompletableFuture.supplyAsync() per eseguire il compito in modo asincrono e restituisce una tassa pari al 15% dell'importo dell'ordine.

3. Dopo aver ricevuto l'importo dell'ordine, calcolare asincronamente il costo di spedizione utilizzando il servizio di calcolo:

  • Utilizzare thenCompose() per eseguire il task in modo sequenziale dopo aver ricevuto l'importo dell'ordine. Chiamare il metodo calculateShipping della classe CalculationService passando l'importo dell'ordine.
Note
Nota

Il metodo calculateShipping() utilizza CompletableFuture.supplyAsync() per eseguire il task in modo asincrono e restituisce un costo di spedizione pari al 10% dell'importo dell'ordine.

4. Combinare i calcoli asincroni di tasse e costo di spedizione per ottenere il costo incrementale totale:

  • Utilizzare thenCombine() per combinare i risultati di due CompletableFuture di tasse e spedizione per ottenere il costo aggiuntivo totale (tasse + costo di spedizione).

5. Combinare l'importo dell'ordine e il costo aggiuntivo totale per ottenere l'importo totale dell'ordine:

  • Utilizzare thenCombine() per combinare i due risultati di CompletableFuture di costo aggiuntivo e importo totale per ottenere l'importo totale dell'ordine.

6. Dopo aver calcolato il totale, stamparlo sulla console:

  • Utilizzare thenAccept() per elaborare e stampare il risultato;
  • Dopo aver completato tutti i calcoli, stampare il totale dell'ordine sulla console.

Per visualizzare il risultato sulla console, è possibile utilizzare questo schema:

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

Se tutte le operazioni vengono eseguite correttamente, si otterrà questo output sulla console:

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

Una volta verificato che tutto funzioni, eseguire i test di verifica nel percorso /src/test/java/OrderProcessingExampleTest.java.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 7
some-alt