在 Scala 里 Option[T] 实际上是一个容器,就像数组或是 List 一样,你可以把他看成是一个可能有零到一个元素的 List。
当你的 Option 里面有东西的时候,这个 List 的长度是 1(也就是 Some),而当你的 Option 里没有东西的时候,它的长度是 0(也就是 None)。
为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,Scala 鼓励你在变量和函数返回值可能不会引用任何值的时候使用 Option 类型。
在没有值的时候,使用 None,这是 Option 的一个子类。如果有值可以引用,就使用 Some 来包含这个值。Some 也是 Option 的子类。
None 被声明为一个对象,而不是一个类,因为我们只需要它的一个实例。这样,它多少有点像 null 关键字,但它却是一个实实在在的,有方法的对象。
Option 有两个子类别,Some 和 None。当程序回传 Some 的时候,代表这个函式成功地给了你一个 String,而你可以透过 get() 函数拿到那个 String,如果程序返回的是 None,则代表没有字符串可以给你。
在返回 None,也就是没有 String 给你的时候,如果你还硬要调用 get() 来取得 String 的话,Scala 一样是会抛出一个 NoSuchElementException 异常给你的。
我们也可以选用另外一个方法 getOrElse。这个方法在这个 Option 是 Some 的实例时返回对应的值,而在是 None 的实例时返回传入的参数。换句话说,传入 getOrElse 的参数实际上是默认返回值。
scala> val map1 = Map("key1" -> "value1") map1: scala.collection.immutable.Map[String,String] = Map(key1 -> value1) scala> val value1 = map1.get("key1") value1: Option[String] = Some(value1) scala> val value2 = map1.get("key2") value2: Option[String] = None