Scala - 尝试转换与匹配与映射方法

Scala - Try transform vs match vs map method

我已经阅读了有关 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
    }

我想知道在这些情况下哪一个会更好,为什么会这样?

谢谢

如果你想从任何(非致命的)异常中恢复,结果 IntTry[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) 来表达该操作,并且您应该始终更喜欢最简单的解决方案,满足您的需求。

虽然这里没有任何理由 return 一个 Try[Int],所以我只是选择 getOrElse