3 回答
这是你想要的?
askPong("cause error")
.handle( (pong, ex) -> ex == null
? CompletableFuture.completedFuture(pong)
: askPong("Ping")
).thenCompose(x -> x);
...Async
此外,除非您打算异步执行所提供函数的主体,否则不要使用这些方法。所以当你做类似的事情时
.handleAsync((x, t) -> {
if (t != null) {
return askPong("Ping");
} else {
return x;
})
您要求if-then-else
在单独的线程中运行。由于askPong
返回 a CompletableFuture
,可能没有理由异步运行它。
当天的危险问题:
thenApply
是什么?thenCompose
exceptionally
我知道这最初是java-8,但是,因为java-12,答案是exceptionallyCompose
:
返回一个新的 CompletionStage,当此阶段异常完成时,它使用应用于此阶段异常的提供函数的结果组成。
正如 JavaDoc 所示,默认实现是:
return handle((r, ex) -> (ex == null)
? this
: fn.apply(ex))
.thenCompose(Function.identity());
也就是说,handle()
用于调用回退,并thenCompose()
解开生成的嵌套CompletableFuture<CompletableFuture<T>>
- 即,您在以前版本的 Java 中会做的事情(如Misha 的答案),除非您必须替换this
为completedFuture(r)
.
在试图找出在 Java 8 中执行 Scala 的 recoverWith 的正确方法时遇到了很多挫折之后,我最终只写了自己的。我仍然不知道这是否是最好的方法,但我创建了类似的东西:
public RecoveryChainAsync<T> recoverWith(Function<Throwable,
CompletableFuture<T>> fn);
通过反复调用recoverWith,我将恢复链中的函数排队,并使用“句柄”自己实现恢复流程。RecoveryChainAsync.getCompletableFuture() 然后为整个链返回一个有代表性的 CompletableFuture。希望这可以帮助。