首页 > 代码库 > Scala 枚举: Enumeration 概述

Scala 枚举: Enumeration 概述

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

Scala 枚举: Enumeration 概述