Scala 枚舉: Enumeration 概述

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

相關文章
相關標籤/搜索