值 null
通常被滥用于表征一个可能会缺失的值,Java 开发者一般都知道 NullPointerException
,通常这是由于某个方法返回了 null
,但这并不是开发者所希望发生的,代码也不好去处理这种异常。
在Scala中,Option
是 null
值的安全替代:Option[A]
是一个类型为 A
的可选值的容器,如果值存在,Option[A] 返回一个 Some[A] ,如果不存在, Option[A] 返回对象 None
。在类型层面上指出一个值是否存在,使用你的代码的开发者(也包括你自己)就会被编译器强制去处理这种可能性,而不能依赖值存在的偶然性。
Option 创建
- 可以通过直接实例化
Some
样例类来创建一个Option
,或者在知道值缺失时,直接使用None
对象:
1 | scala> val a: Option[Int] = None |
- 在实际工作中,不可避免地要去操作一些 Java 库,或者是其他将 null 作为缺失值的JVM 语言的代码,为此, Option 伴生对象提供了一个工厂方法,可以根据给定的参数创建相应的 Option:
1 | scala> val c: Option[String] = Option(null) |
Option 操作
从 Option 抽取值
有多种方法从 Option 中抽取值:
- get 属性:如果值存在,则返回值,如果不存在,则报错
1 | scala> println("a.get: " + a.get) |
- getOrElse() 方法:如果值存在,则返回值,如果不存在,则返回默认值
1 | scala> println("a.getOrElse(0): " + a.getOrElse(0) ) |
- 模式匹配:用模式匹配处理 Option 实例是非常啰嗦的,这也是它非惯用法的原因。所以,即使你很喜欢模式匹配,也尽量用其他方法吧
1 | scala> a match { |
作为集合的 Option
你可以把 Option 看作是某种集合,这个特殊的集合要么只包含一个元素,要么就什么元素都没有。虽然在类型层次上,Option 并不是 Scala 的集合类型,但凡是你觉得 Scala 集合好用的方法, Option 也有,你甚至可以将其转换成一个集合,比如说 List。
1 | // 使用 .foreach |