Scala/Java枚举类型
Scala/Java枚举类型
我已经阅读了这篇文章和这篇文章,但我仍然不理解在Scala中处理这个问题的(惯用的)等效方法
enum Status { OK(1, "Ok", "Okay"), NOT_OK(5, "Not Ok", "Not Okay") BAD(10, "Bad", "Run for your life") int code; String name; String description; // custom fields Status(int code, String name, String description) { this.code = code; this.name = name; this.description = description; } } class Main { public static void main(String[] args) { for(Status status : Status.values) { // iterate through them doStuff(status); } } private doStuff(Status status) { System.out.println(status.description); // and more } }
admin 更改状态以发布 2023年5月20日
case class和枚举示例或类似枚举的东西之间没有直接的映射关系。但是可以通过以下方式实现类似的逻辑:
case class Status(code: Int, name: String, descr: String) object Status { val OK = Status(1, "Ok", "Okay"), val NOT_OK = Status(5, "Not Ok", "Not Okay") val BAD = Status(10, "Bad", "Run for your life") }
接着,如果你想,你可以把它放在一个名为values的列表中:
import Status._ val values = List(OK, NOT_OK, BAD)
然后执行你的操作:
values.foreach(doStuff)
结果与Java版本相同。
如果你需要根据Status的类型执行不同的操作,可以使用模式匹配:
sealed trait Status case class OK(code: Int, name: String, descr: String) extends Status case class Not_Ok(code: Int, name: String, descr: String) extends Status case class Bad(code: Int, name: String, descr: String) extends Status
然后在你的doStuff函数中使用模式匹配,例如:
def doStuff(status: Status) = status match { case OK(c, n, d) => // some code.. // some code for other cases } val values = List(OK(1, "Ok", "Okay"), Not_Ok(5, "Not Ok", "Not Okay"), Bad(10, "Bad", "Run for your life")) value.foreach(doStuff)
在Scala中,您可以创建与Java中的\"枚举\"类似的枚举结构。基本上,您需要做的就是扩展scala.Enumeration类并扩展Val类,如果您需要更复杂的枚举类。否则,您可以使用默认的Val类,它接受Int或String或两者兼备。下面是您的Java代码的Scala版本。\n
object Status extends Enumeration { case class StatusVal(code: Int, name: String, description: String) extends Val val OK = StatusVal(1, "Ok", "Okay") val NOT_OK = StatusVal(1, "Not Ok", "Not Okay") val BAD = StatusVal(1, "Bad", "Run for your life") } object Application extends App { Status.values foreach (s => println(s.asInstanceOf[StatusVal].description)) }