Java CompletableFuture如何返回第一个FALSE或等待所有操作完成后返回TRUE

Java CompletableFuture如何返回第一个FALSE或等待所有操作完成后返回TRUE,java,completable-future,Java,Completable Future,我有一个有点奇怪的情况,似乎不允许这个钉子适合任何广泛建立的可完成的未来洞 在评估返回布尔值的主方法中,我希望允许异步完成对三个不同方法的调用。这三个方法中的每一个都可以返回TRUE或FALSE 如果其中任何一个返回FALSE,我希望计算去掉余数,只返回该FALSE值。关键是,它可以是三者中的任何一个,不一定是第一个 但最重要的是,我需要在实际返回TRUE之前等待评估,直到所有三个都返回TRUE。这一点至关重要 现在,我正在使用一个基本的&&链来进行此评估: public boolean e

我有一个有点奇怪的情况,似乎不允许这个钉子适合任何广泛建立的可完成的未来洞

  • 在评估返回布尔值的主方法中,我希望允许异步完成对三个不同方法的调用。这三个方法中的每一个都可以返回TRUE或FALSE
  • 如果其中任何一个返回FALSE,我希望计算去掉余数,只返回该FALSE值。关键是,它可以是三者中的任何一个,不一定是第一个
  • 但最重要的是,我需要在实际返回TRUE之前等待评估,直到所有三个都返回TRUE。这一点至关重要
现在,我正在使用一个基本的
&&
链来进行此评估:

public boolean evaluateChecks() {
    return checkOne().Join() && checkTwo().Join() && checkThree().Join();
}
然而,这仍然是按照特定的顺序进行的-如果
checkThree()
是第一个返回假值的,它仍然必须等到前两个提供了它们的值之后才能进行计算,这是由于
和&
失败的原因

现在这三个方法都返回
CompletableFuture
,但我可以将它们恢复为正常方法,以便在计算它们的主方法中运行
CompletableFuture


我已经看过了,但似乎没有一个能提供我所需要的功能。

改编自Didier L的答案:

不要使用
异常地
异常地完成
,而是使用
然后接受
来完成
allOf()
返回的
可完成的未来

例如,保存未来,因为您将要对其进行连锁操作:

CompletableFuture<Boolean> a = checkOne(), b = checkTwo(), c = checkThree();
使用上面返回的
CompletableFuture
,如果任何原始期货以
false
完成,您现在可以
更快地完成它

Stream.of(a, b, c).forEach(f -> f.thenAccept(result -> {
    if (!result) {
        allWithFailFast.complete(false);
    }
}));
根据完成顺序及其结果,
allOf
期货将首先完成,并产生期货评估结果,或者其中一个期货将返回
false
,并导致
allWithFailFast
false
完成

Stream.of(a, b, c).forEach(f -> f.thenAccept(result -> {
    if (!result) {
        allWithFailFast.complete(false);
    }
}));
如果多个期货完成且
为false
,则仅第一次调用

allWithFailFast.complete(false);

将做任何事情,其他的基本上将被忽略。

您是否考虑过
倒计时闩锁
?由于项目的其他细节,我无法在此类中实现
可运行
,也无法将此代码拆分为单独的类。如果不实现
Runnable
,我还能实现
CountDownLatch
吗?
.Join()
?这是什么方法?您是否尝试过使用
cancel()
而不是返回false?然后对取消事件执行一些操作?您是否也尝试过此
任何(CompletableFuture…cfs)
?嗯。。。当我尝试在foreach中放置一个返回值时,会得到一个
意外的返回值
。不完全确定如何返回早期的FALSE或最终的TRUE。或者我只是在最后返回
allWithFailFast.join()
?@R.Kåbis
forEach
接受
消费者。你不需要归还里面的任何东西。
allWithFailFast.complete(false)
完成FailFast行为。总体方法抛出错误,因为它没有可报告的布尔值。没有显式返回任何内容。据我所知,我需要在方法末尾的
Stream.of()
@R.Kåbis之后放置一个
return allWithfailFast.join()
,这是什么方法?如果您需要返回一个
CompletableFuture
,则返回
allWithFailFast
,这是您应该使用的以获得最终结果。如果查看我的原始代码,则包含检查评估的
evaluateChecks()
需要返回一个纯布尔值。而一个普通的布尔值正是远端代码所期望的。