Kotlin:如何检查枚举是否包含一个给定的字符串,而不会搞乱例外?

为什么在enum类(以及Java)中没有contains方法? 如何优雅地实现它? 现在我正在使用这个丑陋的方法:

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

enumContains

您可以创建一个类似于猎犬的答案,但使用reified类型参数,而不是enumContains函数。

您不能在Kotlin 1.0中创建独立于JVM的解决方案,但是您可以在Kotlin 1.1中使用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} } 

用法

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

enumValueOfOrNull

如果您还需要实际的枚举条目,那么您可以考虑创建一个enumValueOfOrNull函数。

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

用法

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