Scala Options

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。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程