Spark Scala 枚舉git
* Java 中的那套枚舉並不能直接使用到 Scala 中
* Scala 中的枚舉使用輕量級 Enumeration 進行實現
* Scala 中的枚舉實際上是一個伴隨對象
* Scala 中的枚舉沒有方法重寫功能
* Scala 中的枚舉其實都是 Enumeration.Value 這個對象
和Java和C++不一樣,Scala並無枚舉類型。不過,Spark標準類庫提供了一個 Enumeration類型,能夠用於生成枚舉,定義一個枚舉類的對象,並以Value方法調用枚舉中全部可能值,例如:github
object WeekDay extends Enumeration {app
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value spa
//在這裏定義具體的枚舉實例scala
}對象
這裏咱們定義了7個字段:Mon, Tue, Wed, Thu, Fri, Sat, Sun,而後用Value將他們初始化,代碼還能夠以下表述:字符串
val Mon = Value源碼
val Tue = Valueit
val Wed = Valueio
val Thu = Value
val Fri = Value
val Sat= Value
val Sun = Value
也能夠向Value方法傳入ID,name,或兩個參數都傳入
val Mon = Value(0,」meeting」)
val Tue = Value(1)
val Wed = Value
val Thu = Value
val Fri = Value
val Sat= Value(10,」shopping」)
val Sun = Value
若是不指定ID值,則ID在前一個枚舉值基礎上+1,從零開始,缺省name字段爲字段名
這時能夠用WeekDay.Mon , WeekDay.Tue 來引用枚舉值了
這裏枚舉的類型爲WeekDay.Value而不是WeekDay,後者表明對象
能夠添加一個類型名稱這樣定義
object WeekDay extends Enumeration {
type WeekDay = Value
//這裏僅僅是爲了將Enumration.Value的類型暴露出來給外界使用而已
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
//在這裏定義具體的枚舉實例
}
如今枚舉類型變成了WeekDay.WeekDay
引用枚舉類型的方法:
import WeekDay._
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
WeekDay.values filter isWorkingDay foreach println //使用語法糖進行輸出
枚舉值能夠經過ID或name值進行調用
println(WeekDay(0)) // 輸出 meeting
println(WeekDay.Mon) //直接取枚舉值 meeting
println(WeekDay.Mon.id) //取枚舉值所在序號 0
println(WeekDay.maxId) //枚舉值的個數 7
println(WeekDay.withName("meeting")) //經過字符串獲取枚舉(這裏是不須要反射的) meeting
進一步經過以下代碼理解枚舉類型的構造與使用
舉例:
—————————————定義 TrafficLightColor 對象—————————————-
object TrafficLightColor extends Enumeration {
type TrafficLightColor = Value
val Red = Value(0, "Stop")
val Yellow = Value(10)
val Green = Value("Go")
}
————————定義 Margin 對象以及Margin. Margin Enumeration類型———————
object Margin extends Enumeration {
type Margin = Value
val TOP, BOTTOM, LEFT, RIGHT = Value
}
————————————————使用方法——————————————————
import TrafficLightColor.TrafficLightColor
object Driver extends App {
println(Margin.BOTTOM, Margin.BOTTOM.id)
//輸出 (BOTTOM,1)
def doWhat(color: TrafficLightColor) = {
if (color == TrafficLightColor.Red) "stop"
else if (color == TrafficLightColor.Yellow) "hurry up" else "go"
}
//使用match匹配
def doWhat2(color: TrafficLightColor) = color match {
case TrafficLightColor.Red => "stop"
case TrafficLightColor.Yellow => "hurry up"
case _ => "go"
}
// load Red
val red = TrafficLightColor(0) // Calls Enumeration.apply
println(red, red.id)
//輸出: (Stop,0)
println(doWhat(red))
//輸出: Stop
println(doWhat2(TrafficLightColor.Yellow))
//輸出: hurry up
//打印出全部枚舉
Margin.values.foreach { v => println(v,v.id)}
//輸出: (TOP,0)
// (BOTTOM,1)
// (LEFT,2)
// (RIGHT,3)
}
源碼: https://github.com/scala/scala/blob/v2.12.0/src/library/scala/Enumeration.scala