9
4

3 回答 3

15

这是你想要的?

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,可能没有理由异步运行它。

于 2015-02-22T06:33:55.220 回答
1

当天的危险问题:thenApply是什么?thenComposeexceptionally

我知道这最初是,但是,因为,答案是exceptionallyCompose

exceptionallyCompose[Async](Function<Throwable,? extends CompletionStage<T>> fn [, Executor executor])

返回一个新的 CompletionStage,当此阶段异常完成时,它使用应用于此阶段异常的提供函数的结果组成。

正如 JavaDoc 所示,默认实现是:

return handle((r, ex) -> (ex == null)
              ? this
              : fn.apply(ex))
    .thenCompose(Function.identity());

也就是说,handle()用于调用回退,并thenCompose()解开生成的嵌套CompletableFuture<CompletableFuture<T>>- 即,您在以前版本的 Java 中会做的事情(如Misha 的答案),除非您必须替换thiscompletedFuture(r).

于 2022-01-17T18:50:05.767 回答
0

在试图找出在 Java 8 中执行 Scala 的 recoverWith 的正确方法时遇到了很多挫折之后,我最终只写了自己的。我仍然不知道这是否是最好的方法,但我创建了类似的东西:

public RecoveryChainAsync<T> recoverWith(Function<Throwable,
                                         CompletableFuture<T>> fn);

通过反复调用recoverWith,我将恢复链中的函数排队,并使用“句柄”自己实现恢复流程。RecoveryChainAsync.getCompletableFuture() 然后为整个链返回一个有代表性的 CompletableFuture。希望这可以帮助。

于 2015-09-14T14:32:09.137 回答