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") 
  • Kotlin Date.daysDespués de la function diferente valor de retorno con los mismos arguments
  • Manejo de errores de suscripción anidada RX2.0
  • Kapt3: el file java.io.File no se puede convertir a java.lang.String
  • Kotlin con Android DataBinding en Android Studio 3.0 canary 2
  • Tipo de valor de par universal para extras de bash
  • Orden de configuration de progtwigdores en Rx
  • Se unió a w / Spring Data y QueryDSL para orderar los resultados
  • Las properties de beans no nulas durante la initialization se vuelven nulas durante la invocación del método @Transactional
  • Cómo combinar el flatmap y el anterior Single
  • ¿Cómo convertir intArray a ArrayList <Int> en Kotlin?
  • ¿Cómo convierto un dígito Char (0-9) a su valor numérico?