2017-09-04 91 views
1

我有以下的測試方法異常Scala的未來處理失敗的情況下

def test() = { 
val aa = Future{10} map { 
    case x if x%2 == 0 => (x,x) 
    case _ => val kk = Future.failed(BadRequestException("dd")); kk 
} 
aa 
} 

如果我刪除case _那麼方法的返回類型是Future[(Int, Int)]這正是我想要的。但是,當我添加case _方案時,返回類型將變爲Future[Object]。我無法理解我應該改變什麼,因爲我們的代碼庫中的其他類似方法做類似的事情(我確信我錯過了一些微妙的東西),並且返回類型保持爲自然Future[(Int, Int)]。畢竟,當我爲場景拋出一個異常時,我不希望方法的返回類型被改變。我錯過了什麼或做錯了什麼?

回答

3

您應該使用flatMap而不是map,如下所示。與map方法case _的返回類型是Future[BadRequestException]case x if x%2 == 0返回類型是(Int, Int)。這導致你有一個淨回報類型Future[Object]。這可以通過使用flatMap而不是map來糾正,如下所示。

def test() = Future{10} flatMap { 
    case x if x%2 == 0 => Future.successful((x,x)) 
    case _ => Future.failed(BadRequestException("dd")) 
} 
+0

哦良好的漁獲,現在我知道了,至於而不是返回元組,我可以在它返回未來,然後flatMapping它照顧它,否則我會得到'未來[Future..'。我明白那一部分。我仍然得不到的是,編譯器爲什麼現在開心,並同意我想要的返回類型。 – curiousengineer

+0

,因爲在這兩種情況下,返回類型是Future [(Int,Int)]和Future [BadRequestException],這個返回類型的聯合是Future [(Int,Int)]。而在你最初的映射操作中,兩個返回類型是Future [(Int,Int)]和Future [Future [BadRequestException]],它轉化爲一個聯合類型'Future [Object]' –

+0

我在哪裏可以讀到關於這個再來一點。非常感謝這樣簡潔明瞭的解釋。我想了解哪些聯盟類型會導致哪種終極類型 – curiousengineer