位置:首页 > 高级语言 > Scala在线教程 > Scala Option

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。