Spark Scala 枚舉
* Java 中的那套枚舉並不能直接使用到 Scala 中
* Scala 中的枚舉使用輕量級 Enumeration 進行實現
* Scala 中的枚舉其實是一個伴隨對象
* Scala 中的枚舉沒有方法重寫功能
* Scala 中的枚舉其實都是 Enumeration.Value 這個對象
和Java和C++不同,Scala並沒有枚舉類型。不過,Spark標准類庫提供了一個 Enumeration類型,可以用於生成枚舉,定義一個枚舉類的對象,並以Value方法調用枚舉中所有可能值,例如:
object WeekDay extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
//在這里定義具體的枚舉實例
}
這里我們定義了7個字段:Mon, Tue, Wed, Thu, Fri, Sat, Sun,然后用Value將他們初始化,代碼還可以如下表述:
val Mon = Value
val Tue = Value
val Wed = Value
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