我看到CompletableFuture
的方法handle
与scala Future
的{{1}}方法基本相同,基本上将成功和异常都转换为成功{ {1}}和handle
上游(或java世界中的map
和flatMap
)。
虽然java中的twitter future thenApply
(或scala future thenCompose
)等同于什么?
rescue
基本上类似于旧的java recoverWith
,然后重新抛出更多信息,因此可以使用它。例如,在rescue
或try....catch
中,返回单位为twitterFuture.handle
,因此您返回响应。在scalaFuture.recover
或U
中,它会返回twitterFuture.rescue
,因此您可以采取某些例外情况,添加更多信息并返回scalaFuture.recoverWith
答案 0 :(得分:3)
对于recover
,如果您不需要返回超类并希望吞下所有例外,则可以使用exceptionally
:
CompletableFuture<T> future = ...;
CompletableFuture<T> newFuture = future.exceptionally(_exc -> defaultValue);
否则,您需要使用handle
获取CompletableFuture<CompletableFuture<U>>
,然后使用thenCompose
将其折叠:
CompletableFuture<T> future = ...;
CompletableFuture<T> newFuture = future.handle((v, e) -> {
if (e == null) {
return CompletableFuture.completedFuture(v);
} else {
// the real recoverWith part
return applyFutureOnTheException(e);
}
}).thenCompose(Function.identity());