Kotlin: ¿Cómo verificar si enum contiene una cadena dada sin interferir con las excepciones?

¿Por qué no hay método contains en las classs enum (así como en Java)? ¿Y cómo implementarlo elegantemente? Ahora estoy usando este enfoque feo:

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

enumContains

Puede crear una function enumContains similar a la respuesta de Hound Dog pero usando en su lugar los parameters de tipo reified .

No puede crear una solución independiente de JVM en Kotlin 1.0, pero puede enumValues en Kotlin 1.1 utilizando enumValues .

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

Uso

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

enumValueOfOrNull

Si también necesita la input enum real, entonces podría considerar crear una function enumValueOfOrNull lugar.

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

Uso

 enumValueOfOrNull<MyEnum>("some string") 

Puedes simplemente tomar los values Matriz de tu enumeración y el uso contiene sobre ella. Por ejemplo:

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

Pero para esto necesita tener el valor de cadena correcto para que pueda mayúscula antes de la búsqueda.

Si desea encontrar enum por su valor, eche un vistazo a la búsqueda inversa de enumeraciones.

Podrías hacer algo como esto:

 fun <T : Enum<*>> KClass<T>.contains(value: String): Boolean { return this.java.enumConstants.any { it.name == value } } MyEnum::class.contains("some string") 
  • Obteniendo java.lang.VerifyError al hacer una request de cadena usando Android Volley en Kotlin
  • El argumento de tipo genérico no está dentro de los límites
  • Property getter tipeado en Supertipo en lugar de Implementación en Kotlin
  • Eclipse RCP: export de PDE y Kotlin
  • Calificado en kotlin
  • GSON no puede deserializar la class Kotlin con getter personalizado
  • Kapt generatestubs: no se puede inicializar el object con el constructor interno de la unit testing
  • Interoperabilidad Java: ¿cómo declarar una constante de matriz en time de compilation en Kotlin?
  • ClassNotFoundException en comstackciones posteriores después de convertir MainActivity a Kotlin
  • Creando file WAV con Okio
  • ¿Cómo declarar una class que contiene un campo de tipo genérico en Kotlin?