Scala - Try transform vs match vs map 方法

3

我已经阅读过 Try 上关于 transform 方法的文章,并比较了这个方法与其他方法,以确定哪个更适合编码。下面是代码展示:

val value: Try[Int] = Try("1".toInt)
.transform(f => Success(f), e => Success(0))


val value2: Try[Int] = Try("1".toInt) match {
    case Success(f) => Success(f)
    case Failure(e) => Success(0)
}


val value3: Try[Int] = Try("1".toInt)
    .map(f => f)
    .recover {
      case e: Exception => 0
    }

我想知道在这些情况下哪一个更好,为什么?谢谢。
1个回答

8
如果您想从任何(非致命的)异常中恢复,将结果定义为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,我建议使用recoverNonFatal

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接