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。 |