#java #java-8 #completable-future
#java #java-8 #завершаемый-будущее
Вопрос:
Я вижу, что CompletableFuture
у этого есть метод handle
, который такой же, как у scala Future
handle
, в основном преобразующий успех и исключения в успех, чтобы быть map
и flatMap
вверх по течению (или thenApply
и thenCompose
в мире Java).
Что такое эквивалент twitter future rescue
(или scala future recoverWith
) в java?
rescue
в scala это в основном похоже на старую java try....catch
, затем повторно добавляйте дополнительную информацию, чтобы ее было удобно использовать. Например, в twitterFuture.handle
или scalaFuture.recover
возвращаемая единица — это U
то, что вы возвращаете ответ. В twitterFuture.rescue
or scalaFuture.recoverWith
он возвращает Future[U]
, чтобы можно было принимать определенные исключения, добавлять дополнительную информацию и возвращать Future.exception(xxxxx)
Комментарии:
1. Я не вижу ничего, что вызывается
rescue
в документе API Scala, вы имеете в виду :T](pf:PartialFunction[Throwable,U])(implicitexecutor:scala.concurrent.ExecutionContext):scala.concurrent.Future[U]» rel=»nofollow noreferrer»>recover
(хотя это больше похожеtry/catch
try/finally
на)?2. @kennytm twitter.github.io/util/docs/#com.twitter.util . Будущее
Ответ №1:
Например 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());
Комментарии:
1. размышляя вслух здесь. Но что, если v в ответе равно нулю. Нужно ли его менять на if(e != null) return applyFutureOnException(), поскольку я думал, что v может быть нулевым, но e никогда не может быть нулевым, или я ошибаюсь..
2. @DeanHiller поменял местами ветки.