5.4 Option类型

Scala在指定“不存在”的问题上向前更进了一步。比如,执行模式匹配时,匹配的结果可能是一个对象、一个list、一个元组等等,也可能是不存在。静悄悄的返回null会有两个方面的问题。首先,我们没有显式的表达出“我就是希望没有结果”的意图。其次,没有办法强迫函数调用者对不存在(null)进行检查。Scala想让这样的意图更清晰的表达出来,确实,有时候就需要没有结果。Scala以一种类型安全的方式做到了这一点:它使用Option[T]类型。我们看个例子:

SensibleTyping/OptionExample.scala

  1. def commentOnPractice(input: String) = {
  2. //rather than returning null
  3. if (input == "test") Some("good") else None
  4. }
  5. for (input <- Set("test", "hack")) {
  6. val comment = commentOnPractice(input)
  7. println("input " + input + " comment " +
  8. comment.getOrElse("Found no comments"))
  9. }

这里,commentOnPractice()也许会返回一个注释(String),也许压根没有任何注释,这两点分别用Some[T]None的实例表示。这两个类都继承自Option[T]类。上面代码的输出如下:

  1. input test comment good
  2. input hack comment Found no comments

将类型显式声明为Option[String],Scala会强制我们检查实例的不存在。如此一来,就不太可能因为没有检查null引用而抛出NullPointerException。调用返回Option[T]getOrElse()方法,可以主动的应对结果不存在(None)的情形。