Scala/Java枚举类型

21 浏览
0 Comments

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日
0
0 Comments

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)

0
0 Comments

在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))
}

0