函数参数中的 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 一个选项。