下面的代码段巩固了可完成的未来。下面的问题是我的某些期货交易异常顺利,因此总的来说我的交易结果异常完美。
从Java文档中,我了解到当将来抛出异常时allof会返回异常“返回一个新的CompletableFuture,当所有给定的CompletableFutures完成时完成。如果任何给定的CompletableFutures异常完成,则返回的CompletableFuture也会这样做,并且CompletionException将此异常作为其原因。”
但是我看不到任何其他API可以帮助我在将来完成工作后获得发展
有人可以帮我什么忙吗?换句话说,我想获得没有例外地完成的期货。
CompletableFuture<List<Pair<ExtensionVO, GetObjectResponse>>> result =
CompletableFuture.allOf(
completableFutures.toArray(new CompletableFuture<?>[completableFutures.size()]))
.thenApply(
v ->
completableFutures
.stream()
.map(CompletableFuture::join)
.filter(Objects::nonNull)
.collect(Collectors.toList()));
首先,您必须使用handle
链接一个即使在特殊情况下也可以产生结果的函数,然后,在调用.filter(f -> !f.isCompletedExceptionally())
之前,使用join()
跳过异常完成的期货:
CompletableFuture<List<Pair<ExtensionVO, GetObjectResponse>>> result =
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture<?>[0]))
.handle((voidResult,throwable) ->
completableFutures
.stream()
.filter(f -> !f.isCompletedExceptionally())
.map(CompletableFuture::join)
.filter(Objects::nonNull)
.collect(Collectors.toList()));
原则上,您可以使用throwable
确定是否发生异常,仅在必要时执行isCompletedExceptionally()
检查:
CompletableFuture<List<Pair<ExtensionVO, GetObjectResponse>>> result =
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture<?>[0]))
.handle((voidResult, throwable) ->
(throwable == null?
completableFutures.stream():
completableFutures.stream().filter(f -> !f.isCompletedExceptionally()))
.map(CompletableFuture::join)
.filter(Objects::nonNull)
.collect(Collectors.toList()));
但是如果有的话,这可能只对非常大的列表有用。