如果你想从任何(非致命)异常中恢复,那么结果会更有意义 Int 比 Try[Int] 既然你知道自己有成功的价值,那么最惯用的解决方案就是这样:
Int
Try[Int]
scala> import scala.util.Try import scala.util.Try scala> val value4: Int = Try("1".toInt).getOrElse(0) value4: Int = 1
如果你的实际逻辑更复杂,或者你只是喜欢真正明确,你可以模式匹配:
scala> import scala.util.{ Failure, Success, Try } import scala.util.{Failure, Success, Try} scala> val value5: Int = Try("1".toInt) match { | case Success(i) => i | case Failure(_) => 0 | } value5: Int = 1
如果由于某种原因你真的想最终得到一个 Try[Int] 即使你知道它永远是一个 Success ,我建议使用 recover 和 NonFatal :
Success
recover
NonFatal
scala> import scala.util.Try, scala.util.control.NonFatal import scala.util.Try import scala.util.control.NonFatal scala> val value5: Try[Int] = Try("1".toInt).recover { | case NonFatal(_) => 0 | } value5: scala.util.Try[Int] = Success(1)
请注意,这不需要 .map(f => f) 从你的 value3 ,也取代了全能 case e: Exception 与Scala的 NonFatal 提取器,不匹配致命的例外 OutOfMemoryError (您通常无法从这些异常中恢复,因此您不希望在此处捕获它们)。
.map(f => f)
value3
case e: Exception
OutOfMemoryError
但即使在这种情况下,使用也不是惯用语 transform ,因为你可以使用功能较弱的组合器来表达操作( recover ),你应该总是喜欢做你需要的最简单的解决方案。
transform
回归没有任何理由 Try[Int] 在这里,所以我只是去 getOrElse 。
getOrElse