Intereting Posts
Java / Kotlin: Почему разборки Джексона датируются иначе, чем SimpleDateFormat? Получение класса не найдено Исключение при использовании KotlinJsonAdapterFactory () в Moshi 1.5 с Kotlin Конфигурация запуска / отладки Kotlin Шаблон Nullable var внутри строки Kotlin: можете ли вы объяснить функции расширения члена? Как назвать assertEquals с Double Epsilon / Precision в Котлине? Вывод типа компилятора Kotlin не может выбрать способ вызова (двусмысленность с типичными типами) Плагин JaCoCo Gradle сообщает об уровне покрытия, равном 0,0, для каждой упаковки Обратные вызовы Android и повторное использование кода Почему существует NoClassDefFoundError с классом, который существует? Реализация свойств, объявленных в интерфейсах в Котлине Вызов универсального метода Java varargs от Kotlin Доступ к TextView в пользовательском классе в Котлине Как установить свойство объекта-компаньона в Котлин через отражение? Не может быть возврата внутри Runnable SAM в Котлин?

Kotlin: Как проверить, содержит ли перечисление заданную Строку, не входя в Исключения?

Почему в классах перечисления (как и в Java) нет метода? И как его реализовать элегантно? Теперь я использую этот уродливый подход:

 val contains: Boolean = try { MyEnum.valueOf("some string") true } catch (e: IllegalArgumentException) { false } 

Solutions Collecting From Web of "Kotlin: Как проверить, содержит ли перечисление заданную Строку, не входя в Исключения?"

enumContains

Вы можете создать функцию enumContains аналогичную enumContains Hound Dog , но вместо этого использовать параметры типа enumContains .

Вы не можете создать независимое от JVM решение в Kotlin 1.0, но вы можете в Kotlin 1.1 с помощью enumValues .

Котлин 1.1

 /** * Returns `true` if enum T contains an entry with the specified name. */ inline fun <reified T : Enum<T>> enumContains(name: String): Boolean { return enumValues<T>().any { it.name == name} } 

Kotlin 1.0

 /** * Returns `true` if enum T contains an entry with the specified name. */ inline fun <reified T : Enum<T>> enumContains(name: String): Boolean { return T::class.java.enumConstants.any { it.name == name} } 

Применение

 enumContains<MyEnum>("some string") // returns true or false 

enumValueOfOrNull

Если вам также нужна фактическая запись enum, вы можете вместо этого создать функцию enumValueOfOrNull .

Котлин 1.1

 /** * Returns an enum entry with the specified name or `null` if no such entry was found. */ inline fun <reified T : Enum<T>> enumValueOfOrNull(name: String): T? { return enumValues<T>().find { it.name == name } } 

Kotlin 1.0

 /** * Returns an enum entry with the specified name or `null` if no such entry was found. */ inline fun <reified T : Enum<T>> enumValueOfOrNull(name: String): T? { return T::class.java.enumConstants.find { it.name == name } } 

Применение

 enumValueOfOrNull<MyEnum>("some string") 

Вы можете просто взять values Массив вашего перечисления и использовать его. Например:

 Planets.values().map { it.name }.contains("EARTH") 

Но для этого вам нужно иметь правильное строковое значение, чтобы вы могли загладить его перед поиском.

Если вы хотите найти перечисление по его значению, посмотрите на обратный поиск для перечислений.

Вы могли бы сделать что-то вроде этого:

 fun <T : Enum<*>> KClass<T>.contains(value: String): Boolean { return this.java.enumConstants.any { it.name == value } } MyEnum::class.contains("some string")