你必须map
的Option
做可能包含的有价值的东西。在你的代码的上下文中,我会使用flatMap
,因为当前的方法返回Option
,所以我们必须将嵌套的Option
扁平化。
def toInt(userIdOpt: Option[String]): Option[Int] = userIdOpt flatMap { userId =>
try {
Some(userId.toInt)
} catch {
case e:Exception => None
}
}
scala> val u = Option("2")
u: Option[String] = Some(2)
scala> toInt(u)
res0: Option[Int] = Some(2)
scala> toInt(Some("a"))
res4: Option[Int] = None
我们可以使用Try
来缩短这个。
import scala.util.Try
def toInt(userIdOpt: Option[String]): Option[Int] =
userIdOpt.flatMap(a => Try(a.toInt).toOption)
Try(a.toInt)
返回Try[Int]
,其中转换成功将是一个Success[Int]
和失败的转换(不是整数)将是一个Failure[Throwable]
。 Try
有一个非常方便的方法称为toOption
,它将Success(a)
转换为Some(a)
和Failure
到None
,这正是我们想要的。
Try(userId.toInt).toOption – Infinity