Scala безопасный способ преобразования String в значение Enumeration

Предположим, что у меня есть перечисление:

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 в значение Enumeration?

Ответы

Ответ 1

Вы можете добавить метод к перечислению, чтобы вернуть Option[Value]:

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

Примечание: существующий метод withName действительно выполняет именно это, а затем вызывает getOrElse, бросая исключение в случае "else".

Ответ 2

Создав ответ на @Shadowlands, я добавил этот метод к моему перечислению, чтобы иметь значение по умолчанию 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)
}