位置:首頁 > 高級語言 > Scala教學 > Scala Option

Scala Option

Scala的Option[T]是容器對於給定的類型的零個或一個元件。Option[T]可以是一些[T]或None對象,它代表一個缺失值。例如,Scala映射get方法產生,如果給定的鍵冇有在映射定義的一些(值),如果對應於給定鍵的值已經找到,或None。選項Option類型常用於Scala程序,可以比較這對null值Java可用這表明冇有任何值。例如,java.util.HashMap中的get方法將返回存儲在HashMap的值,或null,如果找到冇有任何值。

比方說,我們有一個檢索來自基於主鍵數據庫中的記錄的方法:

def findPerson(key: Int): Option[Person]

該方法會返回一些 [人士] 如果找到記錄,如果找不到記錄那麼為None。讓我們來看看一個真實的例子:

object Test {
   def main(args: Array[String]) {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      
      println("capitals.get( "France" ) : " +  capitals.get( "France" ))
      println("capitals.get( "India" ) : " +  capitals.get( "India" ))
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
capitals.get( "France" ) : Some(Paris)
capitals.get( "India" ) : None

C:/>

使用可選值最常用的方法是模式匹配。例如:

object Test {
   def main(args: Array[String]) {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      
      println("show(capitals.get( "Japan")) : " +  
                                          show(capitals.get( "Japan")) )
      println("show(capitals.get( "India")) : " +  
                                          show(capitals.get( "India")) )
   }
   
   def show(x: Option[String]) = x match {
      case Some(s) => s
      case None => "?"
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
show(capitals.get( "Japan")) : Tokyo
show(capitals.get( "India")) : ?

C:/>

使用getOrElse()方法:

以下是演示如何使用getOrElse()來訪問值或使用默認值,當冇有值的例子:

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) )
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
a.getOrElse(0): 5
b.getOrElse(10): 10

C:/>

使用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 )
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
a.isEmpty: false
b.isEmpty: true

C:/>

Scala Option方法:

以下可以使用Options的一些重要方法。有關可用方法的完整列表,請Scala的的官方文檔。

SN 方法以及描述
1 def get: A
返回選項的值
2 def isEmpty: Boolean
如果該選項為None返回true,否則為false
3 def productArity: Int
該產品的尺寸大小。對於一個產品A(x_1, ..., x_k), 返回k
4 def productElement(n: Int): Any
該產品的第n個元素,0為基礎。換言之,對於一個產品A(x_1, ..., x_k),,返回 x_(n+1),其中 0 < n < k。
5 def exists(p: (A) => Boolean): Boolean
返回true,如果此選項非空,當應用於此選項的值謂詞p返回true。否則返回false。
6 def filter(p: (A) => Boolean): Option[A]
返回此選項,如果它不為空,並應用謂詞p這個選項的值返回true。否則返回None。
7 def filterNot(p: (A) => Boolean): Option[A]
返回此選項,如果它不為空,並應用謂詞p這個選項的值返回false。否則返回None。
8 def flatMap[B](f: (A) => Option[B]): Option[B]
返回將f應用這個選項的值,如果這個選項不為空的結果。返回None如果此選項是空。
9 def foreach[U](f: (A) => U): Unit
應用過程f給到該選項的值,如果它不為空。否則,什麼都不做。
10 def getOrElse[B >: A](default: => B): B
返回選項的值,如果選擇不為空,否則返回默認計算的結果。
11 def isDefined: Boolean
如果該選項實例為一些返回true,否則為false。
12 def iterator: Iterator[A]
如果它不為空,返回一個單例迭代器返回選項的值,或者如果該選項為空返回空迭代器。
13 def map[B](f: (A) => B): Option[B]
如果這個選項不為空的結果,返回一個包含一些將f應用這個選項的值。否則返回None。
14 def orElse[B >: A](alternative: => Option[B]): Option[B]
返回此選項Option,如果它不為空,否則返回計算替代的結果。
15 def orNull
如果它不為空返回該選項的值,如果它是空則返回null。