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