2015-06-11 33 views
0

如果我有一個List [Try [Int]]來表示函數的某些結果。什麼是用異常進行批處理的慣用斯卡拉方法

scala> import scala.util._ 
scala> val result = List[Try[Int]](
     Success(1), 
     Failure(new RuntimeException("first exception")), 
     Success(2), 
     Failure(new RuntimeException("second exception"))) 

如果我僅僅收取的成功,我躲在例外

scala> result.collect{case Success(x)=>x} 
res1: List[Int] = List(1, 2) 

我可以分區,但結果有待進一步

scala> val res2 = result.partition(_.isSuccess) 
res2: (List[scala.util.Try[Int]], List[scala.util.Try[Int]]) = (List(Success(1), Success(2)),List(Failure(java.lang.RuntimeException: first exception), Failure(java.lang.RuntimeException: second exception))) 

scala> res2._1.collect{case Success(x)=>x} 
res6: List[Int] = List(1, 2) 

scala> res2._2.collect{case Failure(x)=>x} 
res7: List[Throwable] = List(java.lang.RuntimeException: first exception, java.lang.RuntimeException: second exception) 

處理,這會變得更加複雜如果我有一個List[Try[Option[Int]]]

+0

你還沒有描述你實際上想要成功和失敗。你到底在找什麼? –

+0

驗證仍不能涵蓋您希望成功和失敗的情況。 –

回答

2

如何將List[Try[Int]]轉換爲Try[List[Int]]

import scala.util.Try 

val demo = List(Try(1),Try(2)) 

Try(demo.map(x => x.get)) 

對於List[Try[Option[Int]]]也不會變得複雜。

希望我有幫助。

+0

這將返回列表中找到的第一個故障。在這種情況下,其他人隱藏,並且成功(Int)結果也被忽略。 – raisercostin

+0

然後,您可以僅爲res6:List [Int] = List(1,2)過濾出像res6.filter(_。isDefined)這樣的Option值,並且它也不復雜。 – Jet