NO IMAGE

機場等飛機,繼續學習Scala~~ 本文原文出處: http://blog.csdn.net/bluishglc/article/details/51290759 嚴禁任何形式的轉載,否則將委託CSDN官方維護權益!

Option是一個很有意思的類,首先,這個類並不一個真正的集合類,因為它並沒有有繼承Traversable或Iterable。但是,它確實具有Iterable的所有操作,這意味著你完全可以把Option當成一個集合去使用,其中原因你應該可以猜的到,這顯然是隱式轉換在起作用。具體來說是Option的伴生物件中定義了一個隱式轉化函式option2Iterable, 你還記得隱式解析的作用域嗎?伴生物件也是編譯器針對型別進行隱式轉換解析時查詢的作用域,也就是說:當你試圖把Option當成一個Iterable使用時,編譯器是在Option的伴生物件的option2Iterable方法上找到了這個隱式轉化宣告:

implicit def option2Iterable[A](xo: Option[A]): Iterable[A]

從而確認了從Option向Iterable的隱式轉化是定義好的。(至於另外的4個隱式轉換:by any2stringadd, by any2stringfmt, by any2ArrowAssoc, by any2Ensuring是發生在PreDef中的,這4個是面向全域性的任何型別的隱式轉換。

其次,我們來看一下這個類兩個子類:

First, it is far more obvious to readers of code that a variable whose type
is Option[String] is an optional String than a variable of type String,
which may sometimes be null. But most importantly, that programming
error described earlier of using a variable that may be null without first
checking it for null becomes in Scala a type error. If a variable is of type
Option[String] and you try to use it as a String, your Scala program will
not compile.

  1. Option具有更直白的語義:它代表的值可能是一個具體的值,但也可能是空!
  2. 在Java裡判空是一個執行時的動作,因此經常會出現忘記判空導致的空指標異常。但是在scala裡,由於Option的引入,在你試圖使用Option裡的值時,你必選做相應的型別轉換,否則就會出現編譯錯誤,這是引入Option另一個重要目的,在編譯期進行判空處理!

比如:當你宣告一個Option[String]變數時,從語義上你就已經告知了編譯器,包括讀者,這個變數可能是一個String也可能是空,但是在試圖實際讀取這個值時,你必須先進行型別轉換和判空處理,否則編譯就無法通過,這是使用Option的主要同目的。

Option在Scala裡被廣泛使用,主要有如下場景:

  • Using Option in method and constructor parameters
  • Using Option to initialize class fields (instead of using null)
  • Converting null results from other code (such as Java code) into an Option

  • Returning an Option from a method

  • Getting the value from an Option
  • Using Option with collections
  • Using Option with frameworks
  • Using Try/Success/Failure when you need the error message (Scala 2.10 and
    newer)
  • Using Either/Left/Right when you need the error message (pre-Scala 2.10)

其次,我們來看一下這個類兩個子類:

Returning an Option from a method

def toInt(s: String): Option[Int] = {
try {
Some(Integer.parseInt(s.trim))
} catch {
case e: Exception => None
}
}
scala> val x = toInt("1")
x: Option[Int] = Some(1)
scala> val x = toInt("foo")
x: Option[Int] = None 

Getting the value from an Option

這裡有三個類子演示從一個Option裡提取值:

Use getOrElse

scala> val x = toInt("1").getOrElse(0)
x: Int = 1

getOrElse:顧名思義,對於一個Option,如有它確實有值就返回值,否則,也就是為空的話,給一個約定的值。

Use foreach

由於是Option可以被隱式轉換為Iterable,這意味著你可以把它當成一個普通的集合那樣去使用,使用foreach去迭代一個Option就是非常典型的例子。

toInt("1").foreach{ i =>
println(s"Got an int: $i")
}

Use a match expression

toInt("1") match {
case Some(i) => println(i)
case None => println("That didn't work.")
}