Scala 选项(Option)
选项
Scala Option [T]是给定类型的零个或一个元素的容器。Option [T]可以是Some [T]或None对象,表示缺少值。例如,Scala Map的get方法如果找到了与给定键相对应的值,则生成Some(value);如果Map中未定义给定键,则生成None。选项类型在Scala程序中经常使用,您可以将其与Java中可用的空值(表示无值)进行比较。例如,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" ))
}
}
输出-
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 => "?"
}
}
输出:
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) )
}
}
输出:
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 )
}
}
输出:
a.isEmpty: false
b.isEmpty: true
Scala 选项方法
以下是在使用Option时可以使用的重要方法。有关可用方法的完整列表,请查看Scala的参考手册。
方法 | 描述 |
---|---|
def get: A | 返回选项的值。 |
def isEmpty: Boolean | 如果选项为None,返回true,否则返回false。 |
def productArity: Int | 这个产品的尺寸。对于产品a (x_1,…, xk),返回k |
def productElement(n: Int): Any | 乘积的第n个元素,以0为基。换句话说,对于乘积a (x_1,…, x_k)返回x_(n+1),其中0 < n < k。 |
def exists(p: (A) => Boolean): Boolean | 如果该选项为非空,则返回true;如果谓词p应用于该选项的值,则返回true。否则,返回false。 |
def filter(p: (A) => Boolean): Option[A] | 如果非空,则返回该选项,并将谓词p应用于该选项的值将返回true。否则,返回None。 |
def filterNot(p: (A) => Boolean): Option[A] | 如果非空,则返回该选项,并将谓词p应用于该选项的值将返回false。否则,返回None。 |
def flatMap[B](f: (A) => Option[B]): Option[B] |
如果该选项非空,则返回对该选项的值应用f的结果。如果此选项为空,则返回None。 |
def foreach[U](f: (A) => U): Unit |
如果选项的值是非空的,则应用给定的过程f。否则,什么都不做。 |
def getOrElse[B >: A](默认: => B): B |
返回选择的值如果非空的选项,否则返回的结果评估默认 |
def isDefined: Boolean | 如果选项是某个实例,则返回true,否则返回false。 |
def iterator: Iterator[A] | 如果非空,返回一个单例迭代器,返回选项的值;如果选项为空,返回一个空迭代器。 |
def map[B](f: (A) => B): Option[B] |
如果该选项非空,则返回包含应用f到该选项值的结果的Some。否则返回None。 |
def orElse[B >: A](alternative: => Option[B]): Option[B] |
如果非空则返回此选项,否则返回alternative的计算结果。 |
def orNull | 如果非空,则返回选项的值;如果为空,则返回null。 |