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

时间: 2024-10-17 01:29:27

Scala 枚举: Enumeration 概述的相关文章

scala.的Enumeration枚举示例(转)

简介 在scala中没有枚举类型,但在标准类库中提供了Enumeration类来产出枚举.扩展Enumeration类后,调用value方法类初始化枚举中的可能值. 内部类value实际上是一个抽象类,真正创建的是val.因为实际上是Val,所以可以为Value传入id和name.如果不指定,id就是在前一个枚举值id上加一,name则是字段名. scala枚举示例 scala枚举示例 object TrafficLightColor extends Enumeration { type Tra

Scala:Enumeration

Scala开篇(目录) 先开看一下如何声明一个枚举对象 object EnumTest extends Enumeration{ type EnumTest = Value val One,Two,Three = Value } 这和我们在Java中声明有很大区别,Scala的枚举值有些特殊,它的关键是内部有一个Value类,所谓的枚举值都是通过它产生的. 如果我们不做任何约定的话,枚举值默认从0开始,依次+1 下面看一下Value类是怎么工作的. val One,Two,Three = Val

已经废弃的枚举Enumeration

package com.runoob.Collection; import java.util.Enumeration; import java.util.Iterator; import java.util.Vector; public class EnumerationDemo { public static void main(String[] args) { /* * Enumeration:枚举 * 具备枚举取出方式的容器只有Vector */ Vector v = new Vecto

java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类

枚举 枚举概述 是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.举例:一周只有7天,一年只有12个月等. 回想单例设计模式:单例类是一个类只有一个实例 那么多例类就是一个类有多个实例,但不是无限个数的实例,而是有限个数的实例.这才能是枚举类. 自定义枚举类. 第一版:无参构造 1 public class Direction { 2 // 创建几个实例 3 public static final Direction FRONT = new Direction(); 4 public

Java中的枚举--Enumeration

之前并没有注意到枚举这个知识点,因为之前在项目中并没有使用过枚举,可能是项目并不是很复杂的原因吧,今天看张孝祥老师的讲解,觉得,这个枚举真的有很多值得学习的地方,探究一下枚举的设计原理,底层到底是怎么回事. 一.枚举的介绍 1.枚举用于表示编程语言中的一组命名常量 例如,一副牌中的四个套装可以是四个名为Club,Diamond,Heart和Spade的枚举器,属于名为Suit的枚举类型.其他示例包括天然枚举类型(例如行星,星期几,颜色,方向等). 当我们在编译时知道所有可能的值时使用枚举,例如菜

scala.Enumeration 枚举示例

简介 在Scala中并没有枚举类型,但在标准类库中提供了Enumeration类来产出枚举.扩展Enumeration类后,调用Value方法来初始化枚举中的可能值. 内部类Value实际上是一个抽象类,真正创建的是Val.因为实际上是Val,所以可以为Value传入id和name 如果不指定,id就是在前一个枚举值id上加一,name则是字段名 scala枚举示例 object TrafficLightColor extends Enumeration {   type TrafficLigh

scala中枚举

scala没有从语法的角度来支持枚举,而是通过定义了一个接口Enumeration来支持的 object ExecutorState extends Enumeration{ type ExecutorState = Value val LAUNCHING, LOADING, RUNNING, KILLED, FAILED, LOST, EXITED = Value def isFinished(state:ExecutorState):Boolean = { Seq(KILLED, FAILE

scala笔记和akka笔记

非阻塞的程序 应该保障的一些特性 : 等待无关性wait-free:能确保每次的调用在有限的步数之内完成,不管其他调用的步骤有多少.杀掉几个线程 锁无关性lock-free:执行这段程序的某些线程会被延迟,但必须确保至少有一个线程能持续步骤到执行完毕.这一点需防止可能出现的饿死,就是说防止某个线程永远被延迟. 阻碍阻塞无关性obstruction-free:有个时间点,在这个点之后非阻塞方法独立的在有限次步骤内执行完毕 锁无关的程序一定是阻碍无关的,反之不一定. 乐观并行控制法是障碍阻塞无关的,

Scala语法学习手册

1       快速入门... 2 1.1             分号... 2 1.2             常变量声明... 2 1.2.1         val常量... 2 1.2.2         var变量... 2 1.2.3         类型推导... 3 1.2.4         函数编程风格... 3 1.3             Range. 3 1.4             定义函数... 4 1.5             while.if 4 1.6