我已在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
}
我想知道在这些情况下哪个会更好,为什么呢?
谢谢
答案 0 :(得分:5)
如果您想从任何(非致命)异常中恢复,则将结果设为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
和{{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]
。