Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗jvSpCfTc 185 of 322 menu
◀ ▶

Действие 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". Дождитесь конца цепочки.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить