一、Option[T] 是什么?

通常由于某个方法返回了 null ,但这并不是开发者所希望发生的,代码也不好去处理这种异常。

null 通常被滥用来表征一个可能会缺失的值
不过,某些语言以一种特殊的方法对待 null 值,或者允许你安全的使用可能是 null 的值

Scala 试图通过摆脱 null 来解决这个问题,并提供自己的类型用来表示一个值是可选的(有值或无值)
这就是 Option[T] 的特质


Option[T] 是一个类型为 T 的可选值的容器:

  • 如果值存在, Option[T] 就是一个 Some[T]
  • 如果不存在, Option[T] 就是对象 None
scala> val m:Map[String, String] = Map("key1" -> "value1")
m: Map[String,String] = Map(key1 -> value1)

scala> m.get("key1") // 取值成功,返回 Some
res1: Option[String] = Some(value1)

scala> m.get("key2") // 取值不存在,返回 None
res2: Option[String] = None

定义一个变量接收返回值,为了显示清楚,把类型也显示定义

val value1: Option[String] = m.get("key1")
val value2: Option[String] = m.get("key2")

println(value1) // Some("value1")
println(value2) // None

Option 有两个子类别,一个是 Some,一个是 None
当他回传 Some 的时候,代表这个函式成功地给了你一个 String
而你可以透过 get() 这个函式拿到那个 String,如果他返回的是 None,则代表没有字符串可以给你。

二、模式匹配,返回值

object OptionApp {
    def main(args: Array[String]) {
      val map = Map("key1" -> "value1", "key2" -> "value2")

      println("show(map.get( \"key1\")) : " + show(map.get( "key1")) )
      println("show(map.get( \"key3\")) : " + show(map.get( "key3")) )
    }

    def show(op: Option[String]) = op match {
      case Some(value) => value
      case None => "value is null"
    }
}

输出

show(map.get( "key1")) : value1
show(map.get( "key3")) : value is null

三、使用getOrElse()方法 返回值

object OptionApp {
    def main(args: Array[String]) {
      val map = Map("key1" -> "value1", "key2" -> "value2")
      val op1 = map.get( "key1");
      val op3 = map.get( "key3");

      println( op1.getOrElse(11) )
      println( op3.getOrElse(33) )
    }
}

输出

value1
33

getOrElse()方法里面填写的内容,是当获取失败时,使用的默认值

四、isEmpty

object OptionApp {
    def main(args: Array[String]) {
      val map = Map("key1" -> "value1", "key2" -> "value2")
      val op1 = map.get( "key1");
      val op3 = map.get( "key3");

      println( op1.isEmpty )
      println( op3.isEmpty )
    }
}

输出

false
true