我很难理解Scala Option的细微差别,有些课程并希望你能帮助我。
正如我从文档中理解的那样,当我们期望值为Type A或null时,使用Option [A]类型。虽然Scala中不存在null类型,但是当我们与非规模API通信时,可能会发生空方案。
示例 - 假设我有一个将String转换为整数值的函数
def strToInt(s: String): Option[Int] = {
val x: Option[Int] = try {
Some(s.toInt)
} catch {
case e: Exception => None
}
x
}
def stringToInteger(s: String): Int = {
Option(s) match {
case None => 0
case Some(s) => strToInt(s).getOrElse(0)
}
}
这里我有一个Wrapper函数'StringToInteger',它检查函数的输入参数是String还是null。如果为null,则返回默认整数值0,否则尝试使用'strToInt'函数将字符串转换为整数。
但是,当 stringToInteger 的输入参数为空时,我似乎遇到以下错误。
stringToInteger(null)
错误:Null类型的表达式不适用于隐式转换
这是对Option idiom的错误使用吗?
这是我遇到同样错误的另一个例子。在这种情况下,我只是检查输入整数参数是否为空。
def isIntNull(i: Int): Boolean = {
Option(i) match {
case None => true
case Some(i) => false
}
}
结果 -
isIntNull(123)
false
isIntNull(null)
Name: Unknown Error
Message: <console>:31: error: an expression of type Null is ineligible for implicit conversion
isIntNull(null)
答案 0 :(得分:4)
这是因为scala中的Int
不可为空,它代表一个原语。 null
仅适用于引用类型(AnyRef
的子类型),而不适用于基元(AnyVal
的子类型)。
另外,更惯用的是:
import scala.util.Try
Try(s.toInt).toOption
答案 1 :(得分:0)
在scala 2.11中将NULL传递给Option(如Option(null))时出现问题,它会抛出错误 - Null类型的表达式不适用于隐式转换
但它已在2.12中解决(我在2.12.1中测试过)
答案 2 :(得分:0)
何时使用期权很简单。如果某个方法尝试访问合法地不必存在的值,则该方法应返回一个Option。因此,从给定用户ID的数据库中获取用户的方法可以返回Option,但是访问必需的配置文件的函数不应返回Option。