Scala Options
Scala Option[T] 是一个容器,用于存储给定类型的零个或一个元素。Option[T] 可以是 Some[T] 对象,也可以是 None 对象,它表示缺失的值。例如,Scala 的 Map 的 get 方法会在找到与给定键对应的值时返回 Some(value),否则返回 None 。
Option 类型在 Scala 程序中经常被使用,你可以将其与 Java 中的 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应用于该选项的值返回true,则返回true;否则返回false。 |
6 | def filter(p: (A) = > Boolean): Option[A] 如果Option非空并且将谓词p应用于Option的值返回true,则返回该Option。否则,返回None。 |
7 | def filterNot(p: (A) = > Boolean): Option[A] 如果Option非空并且将谓词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 如果Option非空,则将给定的过程f应用于该Option的值。否则,什么都不做。 |
10 | def getOrElse[B >: A](default: => B): B 如果Option是非空的,则返回Option的值,否则返回计算default的结果。 |
11 | def isDefined: Boolean 如果Option是Some的实例,则返回true,否则返回false。 |
12 | def iterator: Iterator[A] 如果Option是非空的,则返回一个单例的迭代器,返回Option的值;如果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 如果Option非空,则返回Option的值,否则返回null。 |