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()来访问值或使用默认值,当没有值的例子:
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()检查该选项是否为 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:/>
以下可以使用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。 |