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

时间:2019-03-04 09:26:40

标签: scala performance coding-style try-catch code-cleanup

我已在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 个答案:

答案 0 :(得分:5)

如果您想从任何(非致命)异常中恢复,则将结果设为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,我建议您使用recover和{{1} }:

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),并用Scala的value3提取器替换全部case e: Exception,这不会致命像NonFatal这样的异常(您通常无法从这些异常中恢复,因此您不想在这里捕获它们)。

尽管如此,即使在这种情况下,使用OutOfMemoryError也不是惯用的,因为您可以使用功能更弱的组合器(transform)来表示操作,并且您始终应首选最简单的组合器满足您需求的解决方案。

不过,实际上没有任何理由在这里返回recover,所以我只想使用Try[Int]