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