为什么contains枚举类(以及Java)中没有方法?以及如何优雅地实现它?现在我正在使用这种丑陋的方法:
val contains: Boolean =
try {
MyEnum.valueOf("some string")
true
} catch (e: IllegalArgumentException) {
false
}
Run Code Online (Sandbox Code Playgroud)
mfu*_*n26 29
enumContains您可以创建一个enumContains类似的功能猎犬的答案,但使用具体化的类型参数来代替.
您无法在Kotlin 1.0中创建独立于JVM的解决方案,但您可以在Kotlin 1.1中使用enumValues.
/**
* 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}
}
Run Code Online (Sandbox Code Playgroud)
/**
* 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}
}
Run Code Online (Sandbox Code Playgroud)
enumContains<MyEnum>("some string") // returns true or false
Run Code Online (Sandbox Code Playgroud)
enumValueOfOrNull如果您还需要实际的枚举条目,那么您可以考虑创建一个enumValueOfOrNull函数.
/**
* 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 }
}
Run Code Online (Sandbox Code Playgroud)
/**
* 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 }
}
Run Code Online (Sandbox Code Playgroud)
enumValueOfOrNull<MyEnum>("some string")
Run Code Online (Sandbox Code Playgroud)
您可以只values使用您的枚举数组,并在其中使用包含。例如:
Planets.values().map { it.name }.contains("EARTH")
Run Code Online (Sandbox Code Playgroud)
但是为此,您需要具有正确的字符串值,以便在搜索之前将其大写。
如果要按其值查找枚举,请查看反向查找枚举。
编辑:
正如@JamesBassett所建议的那样,您可以对其进行优化以使其在找到匹配项后停止查找。
Planets.values().any { it.name == "EARTH" }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6652 次 |
| 最近记录: |