你必須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