选项

除非与期望 null 的遗留 Java 代码交互,否则强烈建议不要使用 null 值。相反, Option 时,应使用一个函数的结果可能要么是东西(Some)或没有(None)。

try-catch 块更适合于错误处理,但如果函数可以合法地返回任何内容,则 Option 适合使用,并且很简单。

Option[T] 可以是 Some(value)(包含 T 类型的值)或 None

def findPerson(name: String): Option[Person]

如果没有人找到,可以退回 None。否则,返回包含 Person 对象的 Some 类型的对象。以下是处理 Option 类型对象的方法。

模式匹配

`findPerson(personName)` match {
    case `Some(person)` => `println(person.surname)`
    case None => println(s"No person found with name $personName")
}

使用 mapgetOrElse

val name = `findPerson(personName)`.map(_.firstName).getOrElse("Unknown")
`println(name)` // Prints either the name of the found person or "Unknown"

使用折叠

val name = `findPerson(personName)`.fold("Unknown")(_.firstName)
// equivalent to the map getOrElse example above.

转换为 Java

如果需要将 Option 类型转换为可归零的 Java 类型以实现互操作性:

val s: Option[String] = Option("hello")
s.orNull           // "hello": String
s.getOrElse(null)  // "hello": String

val n: Option[Int] = Option(42)
n.orNull           // compilation failure (Cannot prove that Null <:< Int.)
n.getOrElse(null)  // 42