2016-10-09 86 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