一般來說,對於每種語言都會有一個關鍵字來表示一個對象引用的“無”。在Java中使用的是null。
而Scala則融合了函數式編程的風格,當預計到變量或者函數返回值可能不會引用任何值的時候,使用Option類型。
Option(選項)類型用來表示一個值。(有值或無值)。
Option[T] 是一個類型為 T 的一個可選值的容器。
Option類包含一個子類Some,當存在可以被引用的值的時候,也就是有值,就可以使用Some來包含這個值。例如Some("Hadoop")
Option類還包含了一個子類None,沒有值。Some和None都是它的子類,他們都是final類,所以不能再有派生子類了。
Option實例就是Some或者None對象實例。
首先我們看這個例子
scala> val book = Map("hadoop" -> 5,"spark" -> 10,"hbase" -> 7);//我們在scala shell中定義了一個Map book: scala.collection.immutable.Map[String,Int] = Map(hadoop -> 5, spark -> 10, hbase -> 7) scala> book.get("hadoop")//然后我們從Map中獲取鍵為hadoop的映射 res0: Option[Int] = Some(5) //我們取到的值的類型為Option[Int],值被包含在Some中返回,讀取實際是對Some進行的操作
scala> book.get("hive")//我們再從Map中獲取鍵為hive的映射 res1: Option[Int] = None//這個值是不存在的,所以返回的值是None對象
當我們想要更改None值為更有意義的數據的時候可以調用getOrElse方法,getOrElse只能替換None值。
scala> book.get("hive").getOrElse("No such book") res2: Any = No such book
我們如何定義使用Option類型呢?
scala> val a : Option[Int] = Some(5) //定義一個值為5的Option實例a a: Option[Int] = Some(5) scala> val b : Option[Int] = None //定義一個無值的Option實例b b: Option[Int] = None scala> a.getOrElse(0) //對有值的Option實例調用getOrElse不能替換值 res5: Int = 5 scala> b.getOrElse(0) //getOrElse只能替換None值 res6: Int = 0
Option實際上是一個容器
我們可以把它看做成一個集合,這不過這個集合要么只包含一個包含在Some中的元素,要么不存在元素顯示None
其實它並不是一個真正的集合類,因為它並沒有有繼承Traversable或Iterable。
但是它確實具有Iterable的所有操作,這意味着你完全可以把Option當成一個集合去使用。
Option類可以使用大部分的集合操作。例如 map、foreach、filter等
scala> book.get("hive").foreach(println) //foreach遍歷到None的時候,什么也不做,不執行println scala> book.get("hadoop").foreach(println) 5
一些常用的方法
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 獲取指定的可選項,以 0 為起始。即 A(x_1, ..., x_k), 返回 x_(n+1) , 0 < n < k. |
5 | def exists(p: (A) => Boolean): Boolean 如果可選項中指定條件的元素存在且不為 None 返回 true,否則返回 false。 |
6 | def filter(p: (A) => Boolean): Option[A] 如果選項包含有值,而且傳遞給 filter 的條件函數返回 true, filter 會返回 Some 實例。 否則,返回值為 None 。 |
7 | def filterNot(p: (A) => Boolean): Option[A] 如果選項包含有值,而且傳遞給 filter 的條件函數返回 false, filter 會返回 Some 實例。 否則,返回值為 None 。 |
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] 如果選項包含有值, 返回由函數 f 處理后的 Some,否則返回 None |
14 | def orElse[B >: A](alternative: => Option[B]): Option[B] 如果一個 Option 是 None , orElse 方法會返回傳名參數的值,否則,就直接返回這個 Option。 |
15 | def orNull 如果選項包含有值返回選項值,否則返回 null。 |