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

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

最佳答案

enumContains
您可以创建类似于Hound DoganswerenumContains函数,但改用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")

08-05 18:02