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。 |