/ 城寒 / Scala - Option & Some

Scala - Option & Some

2018-01-27 posted in [Scala]

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类型对象