Option集合
Option集合为1元集合,表示类型为一个值的存在或者不存在。
其中包含了两个子类型:Some和None
Some是一个类型参数化的单元素集合,None是一个空集合。None类型没有类型参数,因为它永远不包含任何内容。
下面用非NULL和NULL来创建一个Option:
var x:String ="Indeed"
var a=Option(x)
x =null
var b=Option(x)
- 使用isEmpty来判定一个一元的Option集合是否是空的,true表示为空的,false表示为非空
a.isEmpty
b.isEmpty
- 例子:
def divide(amt:Double,divisor:Double) :Option[Double]={
if(divisor ==0 ) None
else Option(amt/divisor)
}
val legit =divide(5,2)
val illegit = divide(3,0)
从Option抽取值
- 一种不安全的操作,get()方法。如果对一个实际上是Some实例的Option调用这个方法,可以成功的接收到其中包含的值。不过如果对一个None实例调用get(),就会触发一个“没有这样的元素的”报错
- 使用匹配表达式
nextOption match {
case Some(x) => x;
case None => -1}
}
- 使用匹配表达式的方式等同于使用函数getOrElse函数,直接返回Option集合中的值,如果值为空,则返回None
getOrElse函数返回case类的问题
- 先看一段代码
case class Address (city:String,state:String ,zip:String)
case class person (var username:String,var passwd:String) {
var age=0
var firstname=""
var lastname=""
var address =None:Option[Address]
}
val p = person("shan","secret")
p.address=Some(Address("guangzhou","guangdong","x"))
- 现在想从
p.address
取出值来,考虑到p.address
为一个Option类,使用get或者getOrElse(),get函数可能会非常的不安全,如果Option集合为None,则返回一个错误。
p.address.get
//返回值为正常的
//使用匹配表达式来进行值的提取
p.address.getOrElse() match {
case Address(x,y,z) => x
}
总结
- 对于Option集合,最好的取值方式就是使用匹配表达式