Scala 集合 - Option



Scala 的 `Option[T]` 是一个容器,它包含零个或一个给定类型的元素。一个 `Option[T]` 可以是 **`Some[T]`** 或 **`None`** 对象,后者表示缺少值。例如,Scala 的 `Map` 的 `get` 方法如果找到与给定键对应的值,则返回 `Some(value)`;如果给定键在 `Map` 中未定义,则返回 **`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
广告