Scala - 可選值 (Options)



Scala 的 `Option[T]` 是一個容器,它包含零個或一個給定型別的元素。`Option[T]` 可以是 `Some[T]` 或 `None` 物件,`None` 表示缺少值。例如,Scala 的 `Map` 的 `get` 方法如果找到與給定鍵對應的值,則返回 `Some(value)`;如果給定鍵在 `Map` 中未定義,則返回 `None`。

`Option` 型別在 Scala 程式中經常使用,您可以將其與 Java 中的 `null` 值進行比較,`null` 值表示沒有值。例如,`java.util.HashMap` 的 `get` 方法要麼返回儲存在 `HashMap` 中的值,要麼在未找到值時返回 `null`。

假設我們有一個方法,它根據主鍵從資料庫中檢索記錄。

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

如果找到記錄,該方法將返回 `Some[Person]`;如果未找到記錄,則返回 `None`。讓我們按照以下程式。

示例

object Demo {
   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" ))
   }
}

將上述程式儲存為 `Demo.scala`。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

capitals.get( "France" ) : Some(Paris)
capitals.get( "India" ) : None

處理可選值最常見的方法是透過模式匹配。例如,嘗試以下程式。

示例

object Demo {
   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 => "?"
   }
}

將上述程式儲存為 `Demo.scala`。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

show(capitals.get( "Japan")) : Tokyo
show(capitals.get( "India")) : ?

使用 `getOrElse()` 方法

以下示例程式演示如何使用 `getOrElse()` 方法訪問值或在沒有值時使用預設值。

示例

object Demo {
   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) )
   }
}

將上述程式儲存為 `Demo.scala`。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

輸出

a.getOrElse(0): 5
b.getOrElse(10): 10

使用 `isEmpty()` 方法

以下示例程式演示如何使用 `isEmpty()` 方法檢查選項是否為 `None`。

示例

object Demo {
   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 )
   }
}

將上述程式儲存為 `Demo.scala`。以下命令用於編譯和執行此程式。

命令

\>scalac Demo.scala
\>scala Demo

示例

a.isEmpty: false
b.isEmpty: true

Scala Option 方法

以下是使用 Option 時可以使用的重要方法。有關可用方法的完整列表,請檢視 Scala 的官方文件。

序號 方法及描述
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`

如果此選項非空且謂詞 p 在應用於此 Option 的值時返回 true,則返回 true。否則,返回 false。

6

`def filter(p: (A) => Boolean): Option[A]`

如果此選項非空且將謂詞 p 應用於此 Option 的值返回 true,則返回此 Option。否則,返回 None。

7

`def filterNot(p: (A) => Boolean): Option[A]`

如果此選項非空且將謂詞 p 應用於此 Option 的值返回 false,則返回此 Option。否則,返回 None。

8

`def flatMap[B](f: (A) => Option[B]): Option[B]`

如果此 Option 非空,則返回將 f 應用於此 Option 值的結果。如果此 Option 為空,則返回 None。

9

`def foreach[U](f: (A) => U): Unit`

如果選項非空,則將給定的過程 f 應用於選項的值。否則,什麼也不做。

10

`def getOrElse[B >: A](default: => B): B`

如果選項非空,則返回選項的值;否則,返回計算 default 的結果。

11

`def isDefined: Boolean`

如果選項是 Some 的例項,則返回 true,否則返回 false。

12

`def iterator: Iterator[A]`

返回一個單例迭代器,如果選項非空,則返回 Option 的值;如果選項為空,則返回空迭代器。

13

`def map[B](f: (A) => B): Option[B]`

如果此 Option 非空,則返回一個包含將 f 應用於此 Option 值的結果的 Some。否則返回 None。

14

`def orElse[B >: A](alternative: => Option[B]): Option[B]`

如果此 Option 非空,則返回此 Option;否則,返回計算 alternative 的結果。

15

`def orNull`

如果選項非空,則返回選項的值;如果為空,則返回 null。

scala_collections.htm
廣告