这三个要放到一起说,因为他们在同一个源码文件中(Option.scala)
Option类型代表任意的值,多用在集合操作中,它可以存储任意类型的值,Option实例就是Some或者None对象实例,Some和None都是它的子类,他们都是final类,所以不能再有派生子类了
Option类型数据可以使用大部分的集合操作,可参考 Array(集合、序列)
Option数据存取其实是对Some对象的操作,看下面代码
val a = Array(10,20,"30","40")
val b = a.lastOption
println(b) // Some(40)
a是一个集合,lastOption返回最后一个Option类型对象,lastOption的代码在TraversableLike.scala中
def lastOption: Option[A] = if (isEmpty) None else Some(last)
last方法
def last: A = {
var lst = head
for (x <- this)
lst = x
lst
}
head方法
def head: A = {
var result: () => A = () => throw new NoSuchElementException
breakable {
for (x <- this) {
result = () => x
break
}
}
result()
}
lastOption方法中将通过last取到的最后一个元素转换为Some类型了,Some是Option的子类,所以返回结果是Option类型,那看看Some的代码
final case class Some[+A](x: A) extends Option[A] {
def isEmpty = false
def get = x
}
它实现了Option的get接口
def get: A
返回了传入的参数 x,所以如果我们遇到Option类型对象,就可以通过它的get方法取得实际元素的值,如:
a.lastOption.get
除了Some类型外,如果集合中是空的,那么操作返回None类型
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
比如Option中的map方法
@inline final def map[B](f: A => B): Option[B] =
if (isEmpty) None else Some(f(this.get))
也就是Option类型只会返回Some或None类型对象