Понимание CompletableFuture.supplyAsync()
В Java класс CompletableFuture предоставляет мощный способ написания асинхронного неблокирующего кода. Одним из методов, предоставляемых CompletableFuture, является supplyAsync(), который позволяет выполнить задачу асинхронно и получить CompletableFuture, который в конечном итоге будет содержать результат задачи. В этой статье мы рассмотрим метод supplyAsync()и обсудим его использование на примерах кода.
Введение в CompletableFuture.supplyAsync()
Метод supplyAsync()— это фабричный метод, который принимает в качестве параметра функциональный интерфейс Supplier. Интерфейс Supplierпредставляет поставщика результатов и имеет единственный метод get(), который возвращает результат. Метод supplyAsync()асинхронно выполняет задачу, указанную интерфейсом Supplier, и возвращает CompletableFuture, который в конечном итоге будет содержать результат.
Синтаксис:
CompletableFuture<T> supplyAsync(Supplier<T> supplier)
Где:
T— тип результата.supplier— функция поставщика, предоставляющая результат.
Примеры кода
Давайте рассмотрим пару примеров кода, чтобы понять, как можно использовать supplyAsync():
Пример 1. Базовое использование
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
return "Hello, CompletableFuture!";
});
future.thenAccept(result -> System.out.println(result));
// Output: Hello, CompletableFuture!
}
}
В этом примере мы создаем CompletableFuture, используя supplyAsync(). Функция поставщика — это лямбда-выражение, которое засыпает на 1 секунду, а затем возвращает строку «Hello, CompletableFuture!». Затем мы присоединяем обратный вызов, используя thenAccept(), чтобы распечатать результат, когда он станет доступен.
Пример 2: объединение CompletableFutures
import java.util.concurrent.CompletableFuture;
public class CompletableFutureExample {
public static void main(String[] args) {
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello,");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "CompletableFuture!");
CompletableFuture<String> combinedFuture = future1
.thenCombine(future2, (result1, result2) -> result1 + " " + result2);
combinedFuture.thenAccept(System.out::println);
// Output: Hello, CompletableFuture!
}
}
В этом примере мы создаем два отдельных экземпляра CompletableFuture, которые предоставляют строки «Hello» и «CompletableFuture!» соответственно. Затем мы используем метод thenCombine(), чтобы объединить результаты обоих фьючерсов путем их объединения. Наконец, мы присоединяем обратный вызов для печати объединенного результата.
В этой статье блога мы рассмотрели метод CompletableFuture.supplyAsync()в Java. Мы узнали о его синтаксисе, использовании и увидели примеры кода, демонстрирующие его функциональность. Используя supplyAsync(), вы можете писать эффективный и масштабируемый асинхронный код на Java.