2016-10-09 15 views
1

を扱う私はさんFutureCompletableFutureはスカラ座のそれと同じである方法handleを持っていることがわかりhandleは基本的にmapflatMap上流にあることを成功にすべて成功し、例外を変換する(またはjavaの世界でthenApplythenCompose)。は何Scalaの今後の救助のJavaのCompletableFuture相当であり、

twitter future rescue(またはscala future recoverWith)と同等のものは何ですか?

rescueは、基本的に古いJava try....catchのようなものですが、さらに詳しい情報で再利用してください。たとえば、twitterFuture.handleまたはscalaFuture.recoverの場合、返品単位はUですので、返信を返します。 twitterFuture.rescueまたはscalaFuture.recoverWithでは、それはそう1は、一定の例外を取るより多くの情報を追加してrecoverについてFuture.exception(xxxxx)

+0

ScalaのAPIドキュメントに 'rescue'という名前のものはありません。あなたは[' recover']を意味しますか(http://www.scala-lang.org/api/current/index.html#scala.concurrent.Future (これは 'try/catch'によく似ていますが)@recover [U%3E:T](pf:PartialFunction [Throwable、U])(implicitexecutor:scala.concurrent.ExecutionContext):scala.concurrent.Future [U]) 'try/finally')? – kennytm

+0

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

答えて

3

を返し、あなたはスーパークラスを返却する必要があり、すべての例外を飲み込むしたくない場合は、あなただけexceptionallyを使用することができFuture[U]を返します。 :

CompletableFuture<T> future = ...; 
CompletableFuture<T> newFuture = future.exceptionally(_exc -> defaultValue); 

そうでない場合は、あなたがCompletableFuture<CompletableFuture<U>>を取得するためにhandleを使用し、それを崩壊し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がnullの場合はどうなりますか? if(e!= null)を返す必要があるかどうかを調べるapplyFutureOnException(vはnullになる可能性があるが、eは決してnullにはならない、あるいは間違っている可能性がある..) –

+0

@DeanHiller分岐を入れ替えた。 – kennytm

関連する問題