Scala - Option & Some
Option, Some, None
Option
Option类型代表任意的值,多用在集合操作中,它可以存储任意类型的值 Option实例就是Some或者None对象实例 Some和None都是它的子类,他们都是final类,所以不能再有派生子类了 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: A1
返回了传入的参数 x,所以如果我们遇到Option类型对象,就可以通过它的get方法取得实际元素的值,如:
a.lastOption.get1
除了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类型对象