Wil*_* Ho 1 performance coding-style scala 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
}
Run Code Online (Sandbox Code Playgroud)
我想知道在这些情况下哪个会更好,为什么呢?
谢谢
如果要从任何(非致命)异常中恢复,则将结果Int比有意义Try[Int],因为您知道自己具有成功价值,因此,最惯用的解决方案如下所示:
scala> import scala.util.Try
import scala.util.Try
scala> val value4: Int = Try("1".toInt).getOrElse(0)
value4: Int = 1
Run Code Online (Sandbox Code Playgroud)
如果您的实际逻辑更复杂,或者您只是更喜欢真正的逻辑,则可以模式匹配:
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
Run Code Online (Sandbox Code Playgroud)
如果出于某种原因,Try[Int]即使您知道它将始终是a Success,但您最终还是希望得到a ,则建议使用recoverand 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)
Run Code Online (Sandbox Code Playgroud)
请注意,这.map(f => f)从您的中省去了不必要的内容value3,并case e: Exception用Scala的NonFatal提取器代替了包罗万象的工具,后者无法匹配致命的异常,例如OutOfMemoryError(您通常无法从这些异常中恢复,因此您不想在这里捕获它们)。
但是,即使在这种情况下,使用也不是惯用的transform,因为您可以使用功能更弱的combinator(recover)来表示该操作,并且您始终应首选能够满足您需求的最简单解决方案。
Try[Int]不过,实际上并没有任何理由返回这里,因此我就选择了getOrElse。