Scala-Option使用

最近进行代码ShowCode,发现不少null值处理的场景,比如赋初始值或者判断非空。还在使用Java中方式,没有使用更简便的Scala-Option进行包装。

Option可以理解为类型容器,通过安全的方式进行方法调用。

Scala中的Option其实在Java中也有类似实现,比如Guava的Optional也大同小异。

这是Option类的定义,它有两个子类:Some 和 None。

img

常用方法:

isEmpty;

get;

getOrElse;

当然还有map、filter等类似集合的方法,所以Option也能当集合来用。

先来了解下Some和None,一个表示有值,一个表示不存在的值。

#Option vs Some
val a = Option("hello")
val b = Some("hello")
a == b //true

#Option vs None
val a = Option("hello")
val b = None
a == b //false

#Option(null) vs None
val a = Option(null)
val b = None
a == b //true

#Some(null) vs None
val a = Some(null)
val b = None
a == b //warn
a.get == b //false

#Some(null).get vs None
val a = Some(null).get
val b = None
a == b //false


#Option(null) vs Some(null)
val a = Option(null)
val b = Some(null)
a == b //false

val a:Option[String] = None
a.getOrElse("empty value") //"empty value"

那么使用Option能帮我们解决什么问题呢。以实际场景举例:

  1. 避免空指针;
  2. 变量赋初始值;
  3. 模式匹配;

比如调用第三方库,每次都要对返回值进行非空判断,可以这样写:

val c = Option(java.lang.Boolean.valueOf(false))
c.isEmpty
//res12: Boolean = false

如果想在为空时给个初始值

val d = Option(null).getOrElse("default value")
d: String = default value

模式匹配也可以

val e = Option(10)
e match {
   case Some(_) => println(s"e=${e.get}")
   case None => println("empty value")
}
//e=10

val f = Option(null)
f match {
   case Some(_) => println(s"e=${e.get}")
   case None => println("empty value")
}
//empty value

总结

使用Option能节省不少在赋值、判断场景下的代码量,不用再担心非安全调用的空指针异常。

posted @ 2023-03-07 18:21  畔山陆仁贾  阅读(111)  评论(0)    收藏  举报