Scala選項

2019-10-16 23:14:29

Scala Option[T]是由給定型別的零或一個元素的一種容器。Option[T]可以是 Some [T]None物件,它代表缺少的值。 例如,如果已找到與給定鍵對應的值,則Scala的Map的get方法會生成Some(value),如果在Map中未定義給定的鍵,則將返回None

Option型別在Scala程式中經常使用,可以將其與Java中可用的null值進行比較,表示null值。 例如,java.util.HashMapget方法返回儲存在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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>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中,使用以下命令編譯和執行此程式。

D:\>scalac Demo.scala
D:\>scala Demo
a.isEmpty: false
b.isEmpty: true