2016-10-09 32 views
1

我看到CompletableFuture有一個方法handle是相同階Futurehandle基本上轉換成功和例外所有成功是mapflatMap上游的(或在java世界中的thenApplythenCompose)。在Java中,什麼是twitter未來rescue(或者scala未來recoverWith)的等價物?什麼是Java CompletableFuture等效階未來援救的和處理

rescue在斯卡拉基本上就像老的java try....catch,然後重新拋出更多的信息,所以它可以很好用。例如,在twitterFuture.handlescalaFuture.recover返回單位是U,因此您返回響應。在twitterFuture.rescuescalaFuture.recoverWith,它返回Future[U]所以可以採取一定的例外情況,添加更多的信息,並返回Future.exception(xxxxx)

+0

我沒有在Scala的API文檔中看到任何叫做'rescue'的東西,你的意思是['recover'](http://www.scala-lang.org/api/current/index.html#scala.concurrent.Future @recover [U%3E:T](pf:PartialFunction [Throwable,U])(implicitexecutor:scala.concurrent.ExecutionContext):scala.concurrent.Future [U])(儘管這更像'try/catch' '嘗試/ finally')? – kennytm

+0

@kennytm http://twitter.github.io/util/docs/#com.twitter.util.Future –

回答

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()); 
+0

在這裏大聲思考。但是如果響應中的v是空的呢?是否需要顛倒if(e!= null)返回applyFutureOnException(),因爲我認爲v可以爲null,但e永遠不能爲null或者我有這個錯誤。 –

+0

@DeanHiller交換分支。 – kennytm