Scala:Option、Some、None

Scala开篇(目录)

这三个要放到一起说,因为他们在同一个源码文件中(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类型对象

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bdmh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值