Option类型


使用Option类型,可以用来有效避免空引用(null)异常。也就是说,将来我们返回某些数据时,可以返回一个Option类型来替代。
定义
scala中,Option类型来表示可选值。这种类型的数据有两种形式:
image.png
如果some指定了一个数,那从这里面取getOrElse方法结果都是该指定的数,若Option为空,则取出的getOrElse值是后面的指定的值,与option无关。就是一个默认的缺省值一样。


Some(x):表示实际的值
image.png

None:表示没有值
image.png
使用getOrElse方法,当值为None是可以指定一个默认值

例子: case

定义一个两个数相除的方法,使用Option类型来封装结果
然后使用模式匹配来打印结果
不是除零,打印结果
除零打印异常错误

  1. /**
  2. * 定义除法操作
  3. * @param a 参数1
  4. * @param b 参数2
  5. * @return Option包装Double类型
  6. */
  7. def dvi(a:Double, b:Double):Option[Double] = {
  8. if(b != 0) {
  9. Some(a / b)
  10. }
  11. else {
  12. None
  13. }
  14. }
  15. def main(args: Array[String]): Unit = {
  16. val result1 = dvi(1.0, 5)
  17. result1 match {
  18. case Some(x) => println(x)
  19. case None => println("除零异常")
  20. }
  21. }

例子: getOrElse

重写上述案例,使用getOrElse方法,当除零时,或者默认值为0

  1. def dvi(a:Double, b:Double) = {
  2. if(b != 0) {
  3. Some(a / b)
  4. }
  5. else {
  6. None
  7. }
  8. }
  9. def main(args: Array[String]): Unit = {
  10. val result = dvi(1, 0).getOrElse(0)
  11. println(result)
  12. }

例子: if判断

  1. //1、获取操作后的返回值
  2. println(toInt("23"))
  3. println(toInt("23").get)
  4. println(toInt("abc"))
  5. // println(toInt("abc").get) ---->报错误,因为没有返回值
  6. val xx = if (toInt("foo").isDefined) toInt("foo") else 0
  7. println("处理结果:"+xx)

isEmpty,nonEmpty,idDefined

注意 :空字符isEmpty是true

  1. !seq.isEmpty -> seq.nonEmpty
  2. seq.size == 0 -> seq.isEmpty
  3. seq.size != 0 -> seq.nonEmpty
  4. !(seq.length > 1) -> seq.isEmpty
  5. !option.isEmpty -> option.isDefined
  6. option == None -> option.isEmpty
  7. option != None -> option.isDefined
  1. scala> "".isEmpty
  2. res0: Boolean = true
  3. scala> "xx".isEmpty
  4. res1: Boolean = false
  5. scala> None.nonEmpty
  6. res2: Boolean = false
  7. scala> None.isEmpty
  8. res3: Boolean = true
  9. scala> Some("").isEmpty
  10. res4: Boolean = false
  11. scala> Some("ss").isEmpty
  12. res5: Boolean = false
  13. scala> Some("ss").nonEmpty
  14. res6: Boolean = true
  15. scala> Some("").nonEmpty
  16. res7: Boolean = true