如果您想从任何(非致命的)异常中恢复,将结果定义为
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
:
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)
请注意,这将从您的
value3
中省略不必要的
.map(f => f)
,并用Scala的
NonFatal
提取器替换了通配符
case e: Exception
,它不会匹配致命的异常,比如
OutOfMemoryError
(您通常无法从这些异常中恢复,因此不希望在此处捕获它们)。
即使在这种情况下,使用
transform
也不是惯用语,因为您可以使用一个更简单的组合子(
recover
)来表达操作,并且应始终选择最简单的解决方案来完成所需的任务。
在这里,实际上没有任何理由返回
Try [Int]
,因此我会选择使用
getOrElse
。