我有一個返回Future [Try [Option [Int]]]的方法。我想提取Int的值作進一步的計算。任何想法如何處理?在scala中處理未來[嘗試[選項]]
0
A
回答
1
只是map
未來,用匹配的情況下,以處理不同的情況:
val result: Future[Try[Option[Int]]] = ???
result.map {
case Success(Some(r)) =>
println(s"Success. Result: $r")
//Further computation here
case Success(None) => //Success with None
case Failure(ex) => //Failed Try
}
1
轉換Future[Try[Option[Int]]]
到Future[Int]
一個哈克的方式是不利的成果轉化爲失敗的未來和flatMapping過。
將嘗試失敗轉換爲將來的失敗,保留異常源自的信息嘗試並將None轉換爲NoneFound異常。
val f: Future[Try[Option[Int]]] = ???
case class TryException(ex: Throwable) extends Exception(ex.getMessage)
case object NoneFound extends Exception("None found")
val result: Future[Int] = f.flatMap {
case Success(Some(value)) => Future.successful(value)
case Success(None) => Future.failed(NoneFound)
case Failure(th) => Future.failed(TryException(th))
}
result.map { extractedValue =>
processTheExtractedValue(extractedValue)
}.recover {
case NoneFound => "None case"
case TryException(th) => "try failures"
case th => "future failures"
}
現在在任何情況下,您都知道異常來自何處。如果沒有發現異常,你知道未來和嘗試是成功的,但選項是沒有的。這樣信息不會丟失,並且嵌套結構被平化爲Future[Int]
。
現在結果類型爲Future[Int]
。只需使用map,flatMap,recover和recoverWith來編寫進一步的動作。
2
future.map(_.map(_.map(i => doSomethingWith(i))))
0
如果你想使用cats你可以做的樂趣(的樂趣某些定義)之類的東西:
import scala.concurrent._
import scala.util._
import scala.concurrent.ExecutionContext.Implicits.global
import cats.Functor
import cats.instances.option._
import cats.implicits._
val x = Future { Try { Some(1) } } // your type
Functor[Future].compose[Try].compose[Option].map(x)(_ + 2)
這個建議只有在你已經很熟悉的貓或scalaz。 否則,你很高興與其他有效的答案一起出發(我特別喜歡地圖 - 地圖一)。
0
如果你真的關心解壓請看看這個,否則通過@pamu來回答你的問題,看看你是如何真正使用你的未來。
假設您的未來值爲result
。
Await.ready(result, 10.seconds).value.get.map { i => i.get}.get
顯然,這不會通過你的失敗,並沒有得到案件,並會拋出異常,不建議等待。
所以,如果你想處理故障和無案例 - >
val extractedValue = Await.ready(f, 10.seconds).value.get match {
case Success(i) => i match {
case Some(value) => value
case None => println("Handling None here")
}
case Failure(i) => println("Handling Failure here")
}
相關問題
- 1. 在Scala Play模板中處理選項
- 2. 未來[選項] Scala for-comprehensions
- 3. 偶爾處理Scala選項
- 4. 處理Scala的選項[T]
- 5. 錯誤處理Scala:未來理解
- 6. 在Scala中處理monads時出錯?嘗試與驗證
- 7. Scala未來的錯誤處理
- 8. 未處理的承諾,拒絕嘗試
- 9. 嘗試添加註冊表項時未處理的異常
- 10. 在R中嘗試處理錯誤
- 11. 嘗試除了在Python中處理
- 12. 處理嘗試在swift3中捕獲URL
- 13. 如何處理未來[選項[BSONDocument]中的播放動作
- 14. 嘗試處理從複選框中刪除項目取消選擇
- 15. 在python中處理選項
- 16. 譜寫未來嘗試
- 17. 嘗試異常處理
- 18. 嘗試使用批處理
- 19. 處理與嘗試......除了
- 20. 在Scala中同時處理
- 21. 在Scala中處理屬性
- 22. 在Scala中處理JSON?
- 23. 爲了理解嘗試monad與未處理異常
- 24. Javascript:嘗試從循環中選擇一個選項來刪除選項
- 25. 如何正確處理Spark/Scala中的選項?
- 26. JSON爲XML在Scala和處理選項()導致
- 27. 選項[未來[選項[INT]] =>未來[選項[INT]]
- 28. 未來呼喚Scala中的理解 - 我如何順序處理它們?
- 29. 異常Scala的未來處理失敗的情況下
- 30. 未捕獲的錯誤:嘗試處理狀態爲rootState.loaded.updated.uncommitted時處理事件`loadedData`
試圖理解你爲什麼有前途[嘗試[選項[INT]]。如果您同時選中「未來」,請嘗試使用方法轉到「選項」,然後您可以嘗試將來自方法組合的結果映射到單個未來 –
我同意@FabioFumarola。必須處理這種類型是非常不幸的。 – mfirry
正確答案在很大程度上取決於您如何處理未來的錯誤案例,嘗試和無。請在此添加更多詳細信息。 – nmat