5.4 Option
类型
Scala在指定“不存在”的问题上向前更进了一步。比如,执行模式匹配时,匹配的结果可能是一个对象、一个list、一个元组等等,也可能是不存在。静悄悄的返回null
会有两个方面的问题。首先,我们没有显式的表达出“我就是希望没有结果”的意图。其次,没有办法强迫函数调用者对不存在(null
)进行检查。Scala想让这样的意图更清晰的表达出来,确实,有时候就需要没有结果。Scala以一种类型安全的方式做到了这一点:它使用Option[T]
类型。我们看个例子:
SensibleTyping/OptionExample.scala
def commentOnPractice(input: String) = {
//rather than returning null
if (input == "test") Some("good") else None
}
for (input <- Set("test", "hack")) {
val comment = commentOnPractice(input)
println("input " + input + " comment " +
comment.getOrElse("Found no comments"))
}
这里,commentOnPractice()
也许会返回一个注释(String
),也许压根没有任何注释,这两点分别用Some[T]
和None
的实例表示。这两个类都继承自Option[T]
类。上面代码的输出如下:
input test comment good
input hack comment Found no comments
将类型显式声明为Option[String]
,Scala会强制我们检查实例的不存在。如此一来,就不太可能因为没有检查null
引用而抛出NullPointerException
。调用返回Option[T]
的getOrElse()
方法,可以主动的应对结果不存在(None
)的情形。