Java 8 CompletableFuture. Часть 2 - продолжение
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В предыдущей статье мы рассмотрели азы асинхронной обработки данных в Java 8 с помощью CompletableFuture. В этой статье мы рассмотрим объединение CompletableFuture в цепочку и обработку исключений.
1. Введение
CompletableFuture - новый класс для асинхронной работы, который дает возможность комбинировать шаги обработки, соединяя их в цепочку. Класс содержит около 50 методов для выполнения, объединения а так же обработки исключений.
2. Объединение с thenCompose()
Объединять CompletableFuture можно несколькими способами, один из них (thenApply()) мы рассмотрели в предыдущей статье, а второй - с помощью thenCompose()
1 2 3 4 5 6 7 |
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10) .thenCompose(result -> CompletableFuture.supplyAsync(() -> result * 2) ).thenCompose(result -> CompletableFuture.supplyAsync(() -> result * 5) ); System.out.println(future.get()); //output 100 |
Метод thenApply() является аналогом Optional.map(), только вот возвращает новое CompletionStage, которое выполняется с результатом этого этапа. В то время как thenCompose() является аналогом Optional.flatMap() и возвращает новое CompletionStage, которое выполняется на этом этапе в качестве аргумента для функции.
3. Объединение с thenCombine()
Если мы хотим по завершению двух задач выполнить третью, то это можно сделать с помощью thenCombine()
1 2 3 4 5 |
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10); CompletableFuture<Integer> anotherFuture = CompletableFuture.supplyAsync(() -> 2); CompletableFuture<Integer> result = future.thenCombine(anotherFuture, (a, b) -> a * b); System.out.println(result.get()); //output 20 |
4. Обработка исключений
CompletableFuture также позволяет нам с легкостью обрабатывать исключения с помощью методов handle()
1 2 3 4 5 6 7 8 9 |
CompletableFuture<Integer> future = CompletableFuture .supplyAsync(() -> { throw new RuntimeException("error in async running"); }).handle((obj, err) -> { System.out.print(err.getMessage()); return 10; }); System.out.println(" "+future.get()); //output java.lang.RuntimeException: error in async running 10 |
и exceptionally()
1 2 3 |
CompletableFuture.supplyAsync(() -> {throw new RuntimeException("error in async running");}) .exceptionally(err -> (5)) .thenAccept(System.out::println) //output 5 |
где вариант с handle() является более гибким, и функция выполнится в любом случае в независимости от того будет исключение или нет; в то время как exceptionally() выполнится только в случае исключения.
В следующей статье мы рассмотрим параллельное выполнение нескольких CompletableFuture.
В Java 8 есть еще множество полезных нововведений, которые можно найти тут
Надеемся - наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.