在Scala里Option[T]實(shí)際上是一個(gè)容器毛俏,就像數(shù)組或是List一樣瘟判,你可以把他看成是一個(gè)可能有零到一個(gè)元素的List。
Option[T] 是一個(gè)類型為 T 的可選值的容器: 如果值存在虑瀑, Option[T] 就是一個(gè) Some[T] 勘伺,如果不存在芹壕, Option[T] 就是對象 None 淆两。
Option[T] 其實(shí)就像一個(gè)中轉(zhuǎn)站一樣:從某一個(gè)地方傳遞過來了一個(gè)值师崎,這個(gè)值我用Some()包裹了起來铺敌,等待別人來拿汇歹。但是當(dāng)有對象來取值時(shí),發(fā)現(xiàn)并沒有這個(gè)值偿凭,這時(shí)候中轉(zhuǎn)站Option[T]就會給它一個(gè)None产弹。如果有就給它用Some()包裹好的值。
接下來了解一下Option[T]當(dāng)中的方法弯囊,就知道了這個(gè)中轉(zhuǎn)站是怎樣工作的了L瞪凇!匾嘱!
get() 方法:
val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2")
println(value1) // Some("value1")
println(value2) // None
在上面的代碼中斤斧,myMap一個(gè)是一個(gè)Key的類型是String,Value的類型是String的hash map奄毡,但不一樣的是他的get()返回的是一個(gè)叫Option[String]的類別折欠。
Scala 使用 Option[String] 來告訴你:我會想辦法回傳一個(gè) String,但也可能沒有 String 給你。
Scala 使用 Option[String] 來告訴你:「我會想辦法回傳一個(gè) String锐秦,但也可能沒有 String 給你」咪奖。
Option有兩個(gè)子類別,一個(gè)是Some酱床,一個(gè)是None羊赵,當(dāng)他回傳Some 的時(shí)候,代表這個(gè)函式成功地給了你一個(gè) String扇谣,而你可以透過get()這個(gè)函數(shù)拿到那個(gè) String昧捷,如果他返回的是None,則代表沒有字符串可以給你罐寨。
由于這樣的特性靡挥,所以就可以應(yīng)用到模式匹配當(dāng)中,來輸出匹配值:
object Test {
def main(args: Array[String]) {
val sites = Map("runoob" -> "www.runoob.com", "google" -> "www.google.com")
println("show(sites.get( \"runoob\")) : " +
show(sites.get( "runoob")) )
println("show(sites.get( \"baidu\")) : " +
show(sites.get( "baidu")) )
}
def show(x: Option[String]) = x match {
case Some(s) => s
case None => "?"
}
}
執(zhí)行以上代碼鸯绿,輸出結(jié)果為:
$ scalac Test.scala
$ scala Test
show(sites.get( "runoob")) : www.runoob.com
show(sites.get( "baidu")) : ?
getOrElse() 方法:
- 可以使用 getOrElse() 方法來獲取對象中存在的元素或者使用其默認(rèn)的值
object Test {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.getOrElse(0): " + a.getOrElse(0) )
println("b.getOrElse(10): " + b.getOrElse(10) )
}
}
執(zhí)行以上代碼跋破,輸出結(jié)果為:
$ scalac Test.scala
$ scala Test
a.getOrElse(0): 5
b.getOrElse(10): 10
isEmpty() 方法:
- 可以使用 isEmpty() 方法來檢測元組中的元素是否為 None
object Test {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.isEmpty: " + a.isEmpty )
println("b.isEmpty: " + b.isEmpty )
}
}
執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac Test.scala
$ scala Test
a.isEmpty: false
b.isEmpty: true