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") 
  • Construir un contenedor autoejecutable con Gradle y Kotlin
  • ¿Puedo inferir el tipo de una propiedad en el delegado?
  • Controlador para ejecutar tareas cada 5 segundos Kotlin
  • Cómo usar Kotlin coroutines await () en el hilo principal
  • Cómo establecer una propiedad estática en una class en Kotlin para Javascript
  • Acerca de Kotlin y funciones
  • Kotlin - ¿Cómo hacer onCompleteListener para get datos de Firestre?
  • Retrollamada Glide después del éxito en Kotlin
  • Después de agregar layouts mediante progtwigción, ¿cómo puedo cambiar la vista de text "#" con el button?
  • Kotlin con Spring DI: la propiedad lateinit no se ha inicializado
  • ¿Por qué IntelliJ Idea no reconoce mis testings de Spek?