2015-11-08 62 views
14

假设我有枚举:斯卡拉转换字符串到枚举值的安全方式

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

我希望能够字符串转换为工作日值,这是罚款:

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 

是否有安全地转换圣一些优雅的方式响铃到枚举值?

回答

26

您可以添加一个方法来枚举返回一个Option[Value]

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

注:现有withName方法是确实正是这个,然后调用getOrElse抛出异常,在“其他”的情况。对@Shadowlands的回答顶

+2

希望这是标准库的一部分,它是惯用的斯卡拉毕竟有一个安全的做事方式。 –

3

大厦,我加入这个方法我的枚举有一个默认值unknwon没有处理选项:

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

所以枚举是这样的:

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