Действие thenAccept в Java
Не всегда нужен следующий тип данных: иногда
достаточно записать строку в лог или обновить
счётчик. Метод thenAccept принимает
Consumer<T> и возвращает
CompletableFuture<Void>. Значение
из предыдущего шага передаётся в колбэк, но
дальше по цепочке не идёт.
Метод thenRun похож, но не получает
результат: только Runnable после
завершения предшественника. Его ставят после
любого этапа, когда нужно лишь сигнал
"готово" без доступа к данным.
Печать и финальный сигнал:
import java.util.concurrent.CompletableFuture;
public class Main {
public static void main(String[] args) {
CompletableFuture<Void> pipeline =
CompletableFuture
.supplyAsync(() -> "order-42")
.thenAccept(id ->
System.out.println("saved " + id)
)
.thenRun(() ->
System.out.println("notify sent")
);
pipeline.join();
}
}
Порядок гарантирован: сначала thenAccept,
затем thenRun. Оба ждут успеха
supplyAsync. Асинхронные варианты
thenAcceptAsync и thenRunAsync
работают так же, как у thenApplyAsync.
После thenAccept нельзя вызвать
thenApply с тем же значением: тип уже
Void. Если нужен и эффект, и
преобразование, сначала thenApply, потом
thenAccept, либо два параллельных
продолжения через thenApply и отдельный
thenAccept от одного источника.
Запустите supplyAsync(() -> 3),
выведите куб
(n * n * n) и после этого
thenRun с текстом "finish".
Дождитесь конца цепочки.