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
}
我想知道在这些情况下哪一个会更好,为什么会这样?
谢谢
如果你想从任何(非致命的)异常中恢复,结果 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
) 来表达该操作,并且您应该始终更喜欢最简单的解决方案,满足您的需求。
虽然这里没有任何理由 return 一个 Try[Int]
,所以我只是选择 getOrElse
。
我已经阅读了有关 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
}
我想知道在这些情况下哪一个会更好,为什么会这样?
谢谢
如果你想从任何(非致命的)异常中恢复,结果 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
) 来表达该操作,并且您应该始终更喜欢最简单的解决方案,满足您的需求。
虽然这里没有任何理由 return 一个 Try[Int]
,所以我只是选择 getOrElse
。