最近进行代码ShowCode,发现不少null值处理的场景,比如赋初始值或者判断非空。还在使用Java中方式,没有使用更简便的Scala-Option进行包装。
Option可以理解为类型容器,通过安全的方式进行方法调用。
Scala中的Option其实在Java中也有类似实现,比如Guava的Optional也大同小异。
这是Option类的定义,它有两个子类:Some 和 None。
常用方法:
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能帮我们解决什么问题呢。以实际场景举例:
- 避免空指针;
- 变量赋初始值;
- 模式匹配;
比如调用第三方库,每次都要对返回值进行非空判断,可以这样写:
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能节省不少在赋值、判断场景下的代码量,不用再担心非安全调用的空指针异常。
标签:None,Option,val,Scala,Some,value,使用,null From: https://www.cnblogs.com/panshan-lurenjia/p/17121034.html