功能参数中的Scala Option类型 - 最佳实践

时间:2017-07-14 04:28:10

标签: scala user-defined-functions optional-parameters

我很难理解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)

3 个答案:

答案 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。