为什么在枚举类(以及Java)中没有contains
方法?以及如何优雅地实现它?现在,我正在使用这种丑陋的方法:
val contains: Boolean =
try {
MyEnum.valueOf("some string")
true
} catch (e: IllegalArgumentException) {
false
}
最佳答案
enumContains
您可以创建类似于Hound Dog的answer的enumContains
函数,但改用reified type parameters。
您无法在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")