0
我有一些服务回报CompletableFutures这样我想要做一些未来的成交订单在CompletableFuture列表
Set<CompletableFuture<String>> futures = service.getSomething();
for (CompletableFuture<String> future : futures) {
System.out.println(future.get());
}
该代码打印值迭代顺序。但我希望首先使用完成服务。
Set<CompletableFuture<String>> futures = service.getSomething();
Set<CompletableFuture<String>> donefutures = new HashSet<>();
while (true) {
if (futures.equals(donefutures)) {
break;
}
futures
.stream()
.filter(f -> !donefutures.contains(f))
.filter(CompletableFuture::isDone)
.peek(donefutures::add)
.map(f -> {
try {
return f.get();
} catch (InterruptedException | ExecutionException e) {
return null;
}
})
.forEach(System.out::println);
Thread.sleep(100);
}
我试过这种方式。它正在工作。但我认为真的很难看。有更好的方法吗?
需要呼叫未来::得到像'futures.forEach(F - > f.get());'。但它工作迭代顺序。我怎么解决这个问题? –
@ KI-YOUNGBANG为什么你需要调用'get()'方法? 'whenComplete'给你执行的结果。 – ledniov
我想等到所有的期货完成。我刚刚测试'futures.forEach(f - > f.get());'工作。因为latest.get()被封锁,而其他时候被完全调用。但我不知道这种方式是正确的。 –