Метод handle
Метод handle класса CompletableFuture позволяет обработать как успешный результат, так и возникшее исключение. В первый параметр мы передаем функцию BiFunction, которая принимает результат и исключение, а возвращает новое значение. Метод возвращает новый объект CompletableFuture с преобразованным результатом. В отличие от thenApply, метод handle вызывается всегда, даже если исходный CompletableFuture завершился с ошибкой.
Синтаксис
CompletableFuture<U> handle(BiFunction<? super T, Throwable, ? extends U> fn)
Пример
Давайте обработаем успешный результат с помощью метода handle:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "abcde");
CompletableFuture<String> res = future.handle((value, ex) -> {
if (ex != null) {
return "error";
}
return value.toUpperCase();
});
System.out.println(res.join());
}
}
Результат выполнения кода:
"ABCDE"
Пример
Давайте обработаем исключение, возникшее при выполнении задачи:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
throw new RuntimeException("something went wrong");
});
CompletableFuture<String> res = future.handle((value, ex) -> {
if (ex != null) {
return "handled: " + ex.getMessage();
}
return value;
});
System.out.println(res.join());
}
}
Результат выполнения кода:
"handled: something went wrong"
Пример
Давайте вернем числовой результат при успехе и 0 при ошибке:
import java.util.concurrent.CompletableFuture;
public class Main
{
public static void main(String[] args)
{
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<Integer> res = future.handle((value, ex) -> {
if (ex != null) {
return 0;
}
return value * 2;
});
System.out.println(res.join());
}
}
Результат выполнения кода:
10
Смотрите также
-
метод
thenApply,
который преобразует результат при успешном выполнении -
метод
exceptionally,
который обрабатывает только исключение -
метод
whenComplete,
который выполняет действие без изменения результата -
метод
join,
который ожидает завершения и возвращает результат