2015-05-29 32 views
0

我有2 Future s的Try我只想做一些事情,只要他們都成功完成。 Future都是獨立的。所以這裏是一些代碼成功的Tuple2上的模式匹配

def a1: Future[Try[String]] = Future { Success("a1") } 
def a2: Future[Try[Int]] = Future { Success(2) } 

val r1 = for { 
    c1 <- a1 
    c2 <- a2 
} yield (c1, c2) 
r1.map { 
    case tpl: (Success[String], Success[Int]) => 
    println("success") 
    case _ => 
    println("failure") 
} 

這打印success。 這個問題是因爲我在Tuple2上的模式匹配,因爲即使第二個元素是Failure,第一個case被執行也會被刪除。所以,如果我改變a2

def a2: Future[Try[Int]] = Future { Failure(new InternalError("error")) } 

,然後現在,即使a2返回Failure上面的代碼仍然打印success再次執行該

val r1 = for { 
    c1 <- a1 
    c2 <- a2 
} yield (c1, c2) 
r1.map { 
    case tpl: (Success[String], Success[Int]) => 
    println("success") 
    case _ => 
    println("failure") 
} 

。我該如何解決?一個非常漂亮的解決方案是使用isInstanceOf[Success[String]]isInstanceOf[Success[Int]]檢查元組的元素,並根據它們的真值進行操作,但有沒有更好的方法?

回答

1

你可以在元組內容的模式匹配:

r1.map { 
    case (_: Success[String], _: Success[Int]) => 
    println("success") 
    case _ => 
    println("failure") 
} 

這樣,它克服了通過調用元組的unapply方法,得到的元組元素,然後檢查它們的類型類型擦除。並且元組元素的運行時類型完好無損,如SuccessFailure

+0

謝謝。那太簡單了,太沒想到了。對不起,打擾了。 – lovesh