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

当任何给定的CompletableFutures用匹配某个谓词的结果完成时,如何使Futures完成?

澹台硕
2023-03-14
List<CompletableFuture<MyService>>

其中MyService是不可变的,如下所示:

public class MyService {
    public boolean isAvailable() {
         return true; // or false
    }
}

我现在想要一个未来,当其中一个未来:

  • 完成;和
  • MyService实例的
  • myService.isavailable()返回true

在继续操作时,我需要有可用的MyService实例。换句话说,我想要一个CompletableFuture ,它在满足这两个条件时完成。

我怎么能这么做?我知道可以使用completablefuture.anyof(...)在其中一个期货完成时继续执行,但我不确定如何集成第二个需求:myservice.isavailable()必须为true。

共有1个答案

燕琛
2023-03-14

更新:我想我现在明白你的问题了。这样代理你的期货对你有帮助吗?

List<CompletableFuture<MyService>> givenFutures; // wherever they came from

CompletableFuture<MyService>[] myFutures = givenFutures.stream()
        .map(future -> {
            final CompletableFuture<MyService> futureWithCheck = new CompletableFuture<>();

            future.thenAccept(myService -> {
                if (myService.isAvailable()) {
                    futureWithCheck.complete(myService);
                }
            });

            return futureWithCheck;})
        .toArray(CompletableFuture[]::new);

// blocking
MyService availableService = (MyService) CompletableFuture.anyOf(myFutures).get();

// do what you want to do with the available service

更新2:我考虑了您关于thencompose的问题,也许我的解决方案的中间部分可以这样表达:

CompletableFuture<MyService>[] myFutures = givenFutures.stream()
        .map(future ->
                future.thenCompose(myService ->
                        myService.isAvailable() ? CompletableFuture.completedFuture(myService) : new CompletableFuture<>()))
        .toArray(CompletableFuture[]::new);

为了完整起见,旧的答案是:

 类似资料:
  • 通常,对于CompletableFuture,我会调用thenApply或它的其他方法,以便在结果可用时立即执行某些操作。然而,我现在有一种情况,我想处理结果,直到我收到一个肯定的结果,然后忽略所有进一步的结果。 如果我只是想获取第一个可用的结果,我可以使用CompletableFuture.anyOf(尽管我讨厌为了调用anyOf而将列表转换为数组)。但那不是我想要的。我想取第一个结果,如果它没

  • 我有一个接口,它提供了一个方法,返回一个,其中包含一个

  • 我想要一个完整的未来,只发出完成的信号(例如,我没有返回值)。 我可以将CompletableFuture实例化为: 但是我应该向完整的方法提供什么呢?例如,我不能做

  • 如何测试线程?A有我的课,我想测试一下。我知道名单上有什么

  • 问题内容: 我有一个页面,我可以在其中插入一些javascript / jquery来操纵输出。我对页面标记等没有任何其他控制。 我需要在页面上的每一个出现之后通过jquery添加一个额外的元素。问题是元素是通过在$(document).ready完成之后发生的现有页面上通过异步调用生成的。 本质上,我需要一种在页面加载并且后续的ajax调用完成之后调用我的jquery的方法。有没有一种方法可以检