2015-11-08 55 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) 
}