gpt4 book ai didi

java - CompletableFuture 如何先返回 FALSE 还是等到全部完成才返回 TRUE

转载 作者:行者123 更新时间:2023-12-02 09:15:48 26 4
gpt4 key购买 nike

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

  • 在评估返回 boolean 值的主要方法中,我希望允许对三种不同方法的调用异步完成。这三个方法中的每一个都可以返回 TRUE 或 FALSE。
  • 如果任何返回FALSE,我希望计算删除余数并简单地返回该FALSE值。重点是,它可以是这三个中的任何一个,不一定是第一个。
  • 但最重要的是,我需要先进行评估,直到所有三个都返回 TRUE,然后再实际返回 TRUE。这一点极其重要

现在,我使用的是基本的 &&链做出此评价:

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

但是,这仍然按特定顺序执行操作 - if checkThree()是第一个返回 FALSE 值的,但由于 && 的方式,它仍然必须等到前两个提供了它们的值才能对其进行求值。失败的作品。

现在所有三个方法都返回 CompletableFuture<Boolean> ,但我可以毫无问题地将它们恢复为正常方法以运行 CompletableFuture在评估它们的主要方法中。

我看过quite a few examples ,但似乎没有一个能够为我提供我需要的功能。

最佳答案

改编自 Didier L 的回答:

不要使用 exceptionallycompleteExceptionally,而是使用 thenAcceptcomplete CompletableFuture > 由 allOf() 返回。

例如,保存 future,因为您要对它们进行链式操作:

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

使用CompletableFuture.allOf等待所有这些完成(大概您不希望出现失败/异常)并将 Void 结果转换为预期的 Booleantrue.

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,如果任何原始 future 以 false 完成,您现在可以更快地完成它。

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

根据完成的顺序及其结果,allOf future 将首先完成并得出评估 future 的结果,或者其中一个 future 将返回 false 并且导致 allWithFailFastfalse 完成。

如果多个 future 以 false 完成,则仅第一个调用

allWithFailFast.complete(false);

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

关于java - CompletableFuture 如何先返回 FALSE 还是等到全部完成才返回 TRUE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58999254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com