Scala将String转换为Enumeration值的安全方式

时间:2015-11-08 11:39:58

标签: scala

假设我有枚举:

object WeekDay extends Enumeration {
  type WeekDay = Value
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

我希望能够将String转换为WeekDay值,这很好用:

scala> WeekDay.withName("Tue")
res10: WeekDay.Value = Tue

但如果我传递了一些未知的'价值,我得到例外:

scala> WeekDay.withName("Ou")
java.util.NoSuchElementException: None.get
  at scala.None$.get(Option.scala:322)
  at scala.None$.get(Option.scala:320)
  at scala.Enumeration.withName(Enumeration.scala:124)
  ... 32 elided

是否有一些优雅的方法可以安全地将String转换为枚举值?

2 个答案:

答案 0 :(得分:39)

您可以在枚举中添加方法以返回Option[Value]

def withNameOpt(s: String): Option[Value] = values.find(_.toString == s)

注意:现有的withName方法实际上就是这样做的,然后调用getOrElse在" else"中抛出异常。情况下。

答案 1 :(得分:4)

在@Shadowlands的回答之上,我将这个方法添加到我的枚举中,以获得默认的unknwon值而不处理选项:

def withNameWithDefault(name: String): Value =
  values.find(_.toString.toLowerCase == name.toLowerCase()).getOrElse(Unknown)

所以enum看起来像这样:

object WeekDay extends Enumeration {
  type WeekDay = Value
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun, Unknown = Value

  def withNameWithDefault(name: String): Value = 
    values.find(_.toString.toLowerCase == name.toLowerCase()).getOrElse(Unknown)
}