Что такое java CompletableFuture эквивалент scala Future rescue и handle

#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 поменял местами ветки.