zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    mac下的docker的Docker.raw占用空间很大?
    python模块uuid产生唯一id
    缓存溢出Buffer Overflow
    (原创)攻击方式学习之(3)
    JSP禁用缓存的方式 response.setHeader( "Pragma", "no-cache" ); setDateHeader("Expires", 0);
    Java框架安全
    Java Web:主动和被动方式检测安全的框架
    一.配置简单的嵌入式tomcat和jetty
    使用embeded tomcat进行嵌入式javaee开发-启动tomcat
    安全隐患,你对X-XSS-Protection头部字段理解可能有误
  • 原文地址:https://www.cnblogs.com/bonnienote/p/6087195.html
Copyright © 2011-2022 走看看