【scala】Option類型


一般來說,對於每種語言都會有一個關鍵字來表示一個對象引用的“無”。在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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM