Kotlin:如何检查枚举是否包含一个给定的字符串,而不会搞乱例外?
为什么在enum类(以及Java)中没有contains
方法? 如何优雅地实现它? 现在我正在使用这个丑陋的方法:
val contains: Boolean = try { MyEnum.valueOf("some string") true } catch (e: IllegalArgumentException) { false }
enumContains
您可以创建一个类似于猎犬的答案,但使用reifiedtypes参数,而不是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 > enumContains(name: String): Boolean { return enumValues().any { it.name == name} }
Kotlin 1.0
/** * Returns `true` if enum T contains an entry with the specified name. */ inline fun > enumContains(name: String): Boolean { return T::class.java.enumConstants.any { it.name == name} }
用法
enumContains("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 > enumValueOfOrNull(name: String): T? { return enumValues().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 > enumValueOfOrNull(name: String): T? { return T::class.java.enumConstants.find { it.name == name } }
用法
enumValueOfOrNull("some string")
你可以values
你的枚举的数组和使用包含它。 例如:
Planets.values().map { it.name }.contains("EARTH")
但为此,您需要有正确的字符串值,以便在搜索之前将其大写。
如果你想通过它的值来查找枚举,请查看枚举的反向查找 。
你可以做这样的事情:
fun > KClass .contains(value: String): Boolean { return this.java.enumConstants.any { it.name == value } } MyEnum::class.contains("some string")