#java #completable-future
Вопрос:
java.util.concurrent.CompletionStage#exceptionally
ожидает функцию, которая возвращает значение, но что, если я просто хочу Consumer
Throwable
java.util.concurrent.CompletionStage#thenAccept
, чтобы для успешного выполнения было как?
ПРАВКА: Чтобы было ясно, я знаю об whenComplete
этом, но это не «принимает Consumer
за Throwable
подобное java.util.concurrent.CompletionStage#thenAccept
«.
Комментарии:
1. Вы могли бы попробовать
whenComplete()
, что беретBiConsumer
, что само по себе либо дает результат, либо выбрасывается.2. Я знаю об
whenComplete
этом, но это не то, о чем я прошу.3. В этом случае вы, возможно, захотите немного пояснить, почему
whenComplete()
это не работает для вас. Вы спросили «что, если я хочу использовать потребителя» — ну,whenComplete()
может быть вариант, если нет другого (я не вижу ни одного, потомуCompletionStage.thenAcceptXxx()
что это единственные методы, которые принимаютConsumer
).4. Я сказал: «Что, если я просто хочу, чтобы потребитель мог использовать такую возможность, как java.util.concurrent. Этап завершения#Затем примите за успешное выполнение». whenComplete не принимает потребителя за предмет, который можно выбросить. Я просто хочу подтвердить, что в Java API такого нет. Я думаю, что ничего подобного нет, но я могу ошибаться.
5. Ну, следующая лучшая вещь для метода, принимающего a
Consumerlt;Throwablegt;
, — это тотBiConsumerlt;T, Throwablegt;
, которыйwhenComplete()
принимает и который получает либо результат, либо выбрасываемый (в соответствии с реализациейCompletableFuture.uniWhenComplete()
которого вызываетсяaccept()
. Если вам нужны отдельные потребители, вы можете создатьBiConsumer
параметр, который принимает значение aConsumer
для каждого из параметров и который вы вызываете, если параметр не равен нулю.