函数参数中的 Scala Option 类型 - 最佳实践
Scala Option type in function parameter - Best Practices
我正在努力理解 Scala Option 的细微差别,有些 类 希望你能帮助我。
据我从文档中了解到,当我们期望值是类型 A 或 null 时,会使用 Option[A] 类型。尽管 Scala 中不存在 null 类型,但当我们与非规模对话时可能会发生 null 场景 API.
示例 - 假设我有一个将字符串转换为整数值的函数
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,它 returns 默认整数值为 0,否则尝试使用 'strToInt' 函数将字符串转换为整数。
但是,当 stringToInteger 的输入参数为 null 时,我似乎 运行 出现以下错误。
stringToInteger(null)
错误:Null 类型的表达式不适合隐式转换
这是对 Option 习语的错误使用吗?
这是我 运行 遇到同样错误的另一个例子。在这种情况下,我只是检查输入整数参数是否为空。
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)
这是因为 scala 中的 Int
是不可空的,它代表一个原语。 null
仅适用于引用类型(AnyRef
的子类型),不适用于原始类型(AnyVal
的子类型)。
此外,更地道:
import scala.util.Try
Try(s.toInt).toOption
在 scala 2.11 中将 NULL 传递给 Option(如 Option(null))时出现问题,它会抛出错误 - Null 类型的表达式不符合隐式转换的条件
但是在2.12解决了(我在2.12.1测试过)
何时使用选项是一件简单的事情。如果一个方法试图访问一个合法地不存在的值,该方法应该 return 一个选项。因此,从给定用户 ID 的数据库中获取用户的方法可以 return 一个选项,但是访问必要配置文件的函数不应该 return 一个选项。
我正在努力理解 Scala Option 的细微差别,有些 类 希望你能帮助我。
据我从文档中了解到,当我们期望值是类型 A 或 null 时,会使用 Option[A] 类型。尽管 Scala 中不存在 null 类型,但当我们与非规模对话时可能会发生 null 场景 API.
示例 - 假设我有一个将字符串转换为整数值的函数
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,它 returns 默认整数值为 0,否则尝试使用 'strToInt' 函数将字符串转换为整数。
但是,当 stringToInteger 的输入参数为 null 时,我似乎 运行 出现以下错误。
stringToInteger(null)
错误:Null 类型的表达式不适合隐式转换
这是对 Option 习语的错误使用吗?
这是我 运行 遇到同样错误的另一个例子。在这种情况下,我只是检查输入整数参数是否为空。
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)
这是因为 scala 中的 Int
是不可空的,它代表一个原语。 null
仅适用于引用类型(AnyRef
的子类型),不适用于原始类型(AnyVal
的子类型)。
此外,更地道:
import scala.util.Try
Try(s.toInt).toOption
在 scala 2.11 中将 NULL 传递给 Option(如 Option(null))时出现问题,它会抛出错误 - Null 类型的表达式不符合隐式转换的条件
但是在2.12解决了(我在2.12.1测试过)
何时使用选项是一件简单的事情。如果一个方法试图访问一个合法地不存在的值,该方法应该 return 一个选项。因此,从给定用户 ID 的数据库中获取用户的方法可以 return 一个选项,但是访问必要配置文件的函数不应该 return 一个选项。