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。
更新:我想我现在明白你的问题了。这样代理你的期货对你有帮助吗?
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的方法。有没有一种方法可以检