Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Завдання: CompletableFuture | Найкращі Практики Багатопотокового Програмування
Багатопотоковість у Java

bookЗавдання: CompletableFuture

Завдання

Ваше завдання — створити систему, яка обробляє замовлення та виконує додаткові розрахунки, такі як податок і вартість доставки. Необхідно обробляти кілька замовлень асинхронно, виконувати потрібні розрахунки та відображати загальну суму для кожного замовлення після завершення всіх розрахунків.

Кожне замовлення має унікальний ідентифікатор та вартість. (клас InitMap)

ID та їх суми зберігаються у Map у класі InitMap. Ключі цієї Map (які є ID замовлень) використовуються для ітерації у методі processOrders().

Отримання даних про замовлення виконується асинхронно і повертає суму замовлення. Це реалізовано у класі OrderService, зокрема у методі fetchOrderAmount(String orderId).

Податок розраховується як 15% від суми замовлення. Це виконується у класі CalculationService за допомогою методу calculateTax().

Вартість доставки розраховується як 10% від суми замовлення. Це також виконується у класі CalculationService за допомогою методу calculateShipping().

Note
Примітка

Ваше основне завдання — поетапно реалізувати логіку у пакеті task, класі OrderProcessingExample, у методі processOrders().

Кроки реалізації

1. Отримання суми замовлення асинхронно за допомогою сервісу замовлень:

  • Створити об'єкт CompletableFuture для отримання суми замовлення асинхронно;
  • Викликати метод fetchOrderAmount() з OrderService, передавши order id.
Note
Примітка

Метод fetchOrderAmount() використовує CompletableFuture.supplyAsync() для асинхронного виконання завдання та повертає суму замовлення за його ідентифікатором.

2. Після отримання суми замовлення асинхронно обчислити податок за допомогою сервісу обчислень:

  • Використати thenCompose() для послідовного виконання завдання після отримання суми замовлення. Викликати метод calculateTax() з CalculationService, передавши суму замовлення.
Note
Примітка

Метод calculateTax() використовує CompletableFuture.supplyAsync() для асинхронного виконання завдання та повертає податок, що дорівнює 15% від суми замовлення.

3. Після отримання суми замовлення асинхронно обчислити вартість доставки за допомогою сервісу обчислень:

  • Використати thenCompose(), щоб виконати задачу послідовно після отримання суми замовлення. Викликати метод calculateShipping з класу CalculationService, передавши суму замовлення.
Note
Примітка

Метод calculateShipping() використовує CompletableFuture.supplyAsync() для асинхронного виконання задачі та повертає вартість доставки, що дорівнює 10% від суми замовлення.

4. Об'єднати асинхронні обчислення податку та вартості доставки для отримання загальної додаткової вартості:

  • Використати thenCombine() для об'єднання двох результатів CompletableFuture податку та доставки з метою отримання загальної додаткової вартості (податок + вартість доставки).

5. Об'єднати суму замовлення та загальну додаткову вартість для отримання загальної суми замовлення:

  • Використати thenCombine() для об'єднання двох результатів CompletableFuture додаткової вартості та загальної додаткової вартості й загальної суми замовлення для отримання загальної суми замовлення.

6. Після обчислення загальної суми вивести її у консоль:

  • Використати thenAccept() для обробки та виведення результату;
  • Після завершення всіх обчислень вивести загальну суму замовлення у консоль.

Щоб вивести результат у консоль, використовуйте цей шаблон:

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

Якщо ви все зробили правильно, у консолі отримаєте такий результат:

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

Після того як переконаєтеся, що все працює, запустіть перевірочні тести за шляхом /src/test/java/OrderProcessingExampleTest.java.

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 4. Розділ 7

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

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

bookЗавдання: CompletableFuture

Свайпніть щоб показати меню

Завдання

Ваше завдання — створити систему, яка обробляє замовлення та виконує додаткові розрахунки, такі як податок і вартість доставки. Необхідно обробляти кілька замовлень асинхронно, виконувати потрібні розрахунки та відображати загальну суму для кожного замовлення після завершення всіх розрахунків.

Кожне замовлення має унікальний ідентифікатор та вартість. (клас InitMap)

ID та їх суми зберігаються у Map у класі InitMap. Ключі цієї Map (які є ID замовлень) використовуються для ітерації у методі processOrders().

Отримання даних про замовлення виконується асинхронно і повертає суму замовлення. Це реалізовано у класі OrderService, зокрема у методі fetchOrderAmount(String orderId).

Податок розраховується як 15% від суми замовлення. Це виконується у класі CalculationService за допомогою методу calculateTax().

Вартість доставки розраховується як 10% від суми замовлення. Це також виконується у класі CalculationService за допомогою методу calculateShipping().

Note
Примітка

Ваше основне завдання — поетапно реалізувати логіку у пакеті task, класі OrderProcessingExample, у методі processOrders().

Кроки реалізації

1. Отримання суми замовлення асинхронно за допомогою сервісу замовлень:

  • Створити об'єкт CompletableFuture для отримання суми замовлення асинхронно;
  • Викликати метод fetchOrderAmount() з OrderService, передавши order id.
Note
Примітка

Метод fetchOrderAmount() використовує CompletableFuture.supplyAsync() для асинхронного виконання завдання та повертає суму замовлення за його ідентифікатором.

2. Після отримання суми замовлення асинхронно обчислити податок за допомогою сервісу обчислень:

  • Використати thenCompose() для послідовного виконання завдання після отримання суми замовлення. Викликати метод calculateTax() з CalculationService, передавши суму замовлення.
Note
Примітка

Метод calculateTax() використовує CompletableFuture.supplyAsync() для асинхронного виконання завдання та повертає податок, що дорівнює 15% від суми замовлення.

3. Після отримання суми замовлення асинхронно обчислити вартість доставки за допомогою сервісу обчислень:

  • Використати thenCompose(), щоб виконати задачу послідовно після отримання суми замовлення. Викликати метод calculateShipping з класу CalculationService, передавши суму замовлення.
Note
Примітка

Метод calculateShipping() використовує CompletableFuture.supplyAsync() для асинхронного виконання задачі та повертає вартість доставки, що дорівнює 10% від суми замовлення.

4. Об'єднати асинхронні обчислення податку та вартості доставки для отримання загальної додаткової вартості:

  • Використати thenCombine() для об'єднання двох результатів CompletableFuture податку та доставки з метою отримання загальної додаткової вартості (податок + вартість доставки).

5. Об'єднати суму замовлення та загальну додаткову вартість для отримання загальної суми замовлення:

  • Використати thenCombine() для об'єднання двох результатів CompletableFuture додаткової вартості та загальної додаткової вартості й загальної суми замовлення для отримання загальної суми замовлення.

6. Після обчислення загальної суми вивести її у консоль:

  • Використати thenAccept() для обробки та виведення результату;
  • Після завершення всіх обчислень вивести загальну суму замовлення у консоль.

Щоб вивести результат у консоль, використовуйте цей шаблон:

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

Якщо ви все зробили правильно, у консолі отримаєте такий результат:

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

Після того як переконаєтеся, що все працює, запустіть перевірочні тести за шляхом /src/test/java/OrderProcessingExampleTest.java.

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 4. Розділ 7
some-alt