
- Scala 教程
- Scala - 首頁
- Scala - 概述
- Scala - 特性
- Scala - 環境搭建
- Scala - 構建工具 (SBT)
- Scala - 基本語法
- 資料型別和變數
- Scala - 資料型別
- Scala - 變數
- Scala - 字串
- Scala - 陣列
- Scala 運算子
- Scala - 運算子
- Scala - 算術運算子
- Scala - 關係運算符
- Scala - 邏輯運算子
- Scala - 位運算子
- Scala - 賦值運算子
- Scala 條件語句
- Scala - if else 語句
- Scala 迴圈語句
- Scala - 迴圈語句
- Scala - while 迴圈
- Scala - do-while 迴圈
- Scala - for 迴圈
- Scala - break 語句
- Scala 類與物件
- Scala - 類與物件
- Scala - 訪問修飾符
- Scala 方法與函式
- Scala - 函式
- Scala - 按名呼叫函式 (Call-by-Name)
- Scala - 帶命名引數的函式
- Scala - 帶變長引數的函式
- Scala - 遞迴函式
- Scala - 預設引數值
- Scala - 高階函式
- Scala - 巢狀函式
- Scala - 匿名函式
- 部分應用函式
- Scala - 柯里化函式
- Scala 集合
- Scala - 集合
- Scala - 列表 (Lists)
- Scala - 集合 (Sets)
- Scala - 對映 (Maps)
- Scala - 元組 (Tuples)
- Scala - 迭代器 (Iterators)
- Scala - 可選值 (Options)
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 異常處理
- Scala - 提取器 (Extractors)
- Scala - 正則表示式
- Scala 檔案 I/O
- Scala - 檔案 I/O
- Scala 高階概念
- Scala - 閉包 (Closures)
- Scala - 特質 (Traits)
- Scala 有用資源
- Scala - 快速指南
- Scala - 線上編譯器
- Scala - 有用資源
- Scala - 討論
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。 |