当前位置: 首页 > 知识库问答 >
问题:

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

江宏放
2023-03-14

我有一点奇怪的情况,似乎不允许这个挂钩适合任何广泛建立的CompletableFuture漏洞。

  • 在评估返回布尔值的主要方法中,我希望允许对三个不同方法的调用异步完成。这三个方法中的每一个都可以返回TRUE或FALSE。
  • 如果任何返回FALSE,我希望评估删除余数并简单地返回FALSE值。重点是,它可以是三个中的任何一个,不一定是第一个。
  • 但最重要的是,我需要在实际返回TRUE之前等待所有三个返回TRUE的评估。这非常重要。

现在,我正在使用一个基本的

public boolean evaluateChecks() {
    return checkOne().Join() && checkTwo().Join() && checkThree().Join();
}

然而,这仍然是按照特定的顺序进行的——如果checkThree()是第一个返回假值的,它仍然必须等到前两个提供了它们的值之后,才能进行计算,这是由于

现在这三种方法都返回CompletableFuture

我看过很多例子,但似乎没有一个能为我提供所需的功能。


共有1个答案

解修然
2023-03-14

改编自Didier L的回答:

  • 如何实现CompletableFuture.allOf(),一旦任何期货失败就异常完成?

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

例如,保存期货,因为您将对它们进行连锁操作:

CompletableFuture<Boolean> a = checkOne(), b = checkTwo(), c = checkThree();

使用CompletableFuture。允许等待它们全部完成(想必您不希望出现故障/异常),并将Void结果转换为true的预期布尔值。

CompletableFuture<Boolean> allWithFailFast = CompletableFuture.allOf(a, b, c).thenApply(__ -> a.join() && b.join() && c.join());
// if there is an exception, it'll be propagated to the future returned by thenApply

使用上面返回的CompletableFuture,如果任何原始期货使用false完成,您现在可以更快地完成

Stream.of(a, b, c).forEach(f -> f.thenAccept(result -> {
    if (!result) {
        allWithFailFast.complete(false);
    }
}));

根据完成顺序及其结果,allOffuture将首先完成,并给出对期货的评估结果,或者其中一个期货将返回false,并使allWithFailFastfalse完成。

如果多个期货以false完成,则只有第一次调用

allWithFailFast.complete(false);

不管做什么,其他人基本上都会被忽略。

 类似资料:
  • 我想有一个清单的comletablefutures我想等待。带有以下代码。 问题是,在所有的期货,其中一些可以是缓慢的,我想在到期时间后,get方法返回与所有完成的结果。有办法做到这一点吗? 多谢.

  • 我正在尝试实现一个通用的REST客户端,如下所示。我有自己的模型将HTTP响应表示为response T。这里T是服务调用的返回类型,它可能只是T或Ts列表。下面的代码不编译,我需要帮助。 最终调用下面的方法,

  • 我正在查询URI以从web服务获取一些数据。那很好。但我注意到,我的json hase多页的page\u计数,但只返回第一页数据。 以下是json的样子: 如何返回所有页面而不是只返回第一页?我知道这可能不是个好主意,但我该怎么做? 更新:web服务的URI类似于: 谢谢

  • 问题内容: 我有一个这样的函数,它创建一个写流,然后将字符串数组写到文件中。写作完成后,我想使它返回Promise。但是我不知道该如何做。 感谢您的任何评论! 问题答案: 您将要使用构造函数:

  • 我运行的代码与这个问题中的问题类似,只是从每个文档中提取数组,并将它们的元素添加到全局数组列表中。之后,在,我对该数组执行一个操作并返回。但是,如果我登录。d从onSuccess侦听器中获取全局ArrayList大小,它给出了正确的答案,但如果我在集合之外这样做。get()它总是给出0。我的问题是,我无法从onSuccess中返回,因为这不会返回我的整个函数,所以我需要在收集之后执行。get(),

  • 问题内容: 我敢肯定,有一种更简单的方法可以做到这一点,而这只是我自己没有想到的。 我正在调用一堆返回列表的方法。该列表可能为空。如果列表是非空的,我想返回第一项;否则,我想返回无。此代码有效: 在我看来,这样做应该有一个简单的一句习惯用语,但是对于我的一生,我想不起。在那儿? 编辑: 我在这里寻找单行表达式的原因并不是我喜欢令人难以置信的简洁代码,而是因为我不得不编写很多这样的代码: 我想做的事