Scala - 选项

Scala Option[ T ] 是给定类型的零个或一个元素的容器。 Option[T] 可以是 Some[T]None 对象,表示缺失值。 例如,如果找到了与给定键对应的值,则 Scala 的 Map 的 get 方法会生成 Some(value) ,如果在 Map 中未定义给定键,则生成 None

选项类型在 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 选项方法

以下是您在使用 Options 时可以使用的重要方法。 有关可用方法的完整列表,请查看 Scala 的官方文档。

序号 带有描述的方法
1

def get: A

返回选项的值。

2

def isEmpty: Boolean

如果选项为 None 返回 true,否则返回 false。

3

def productArity: Int

The size of this product. For a product A(x_1, ..., x_k), returns 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]

如果它是非空的,则返回此选项并将谓词 p 应用于此选项的值返回 true。 否则,返回无。

7

def filterNot(p: (A) => Boolean): Option[A]

如果它是非空的并且将谓词 p 应用于此选项的值返回 false,则返回此选项。 否则,返回无。

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

如果选项是 Some 的实例,则返回 true,否则返回 false。

12

def iterator: Iterator[A]

如果选项非空,则返回一个单例迭代器,返回选项的值;如果选项为空,则返回一个空迭代器。

13

def map[B](f: (A) => B): Option[B]

如果此 Option 为非空,则返回 Some ,其中包含将 f 应用于此 Option 的值的结果。 否则返回无。

14

def orElse[B >: A](alternative: => Option[B]): Option[B]

如果它是非空的,则返回此选项,否则返回评估替代的结果。

15

def orNull

如果选项非空,则返回选项的值,如果为空,则返回 null。

❮ Scala 集合