当前位置:  开发笔记 > 开发工具 > 正文

Kotlin:如何检查枚举是否包含给定的字符串而不会弄乱异常?

如何解决《Kotlin:如何检查枚举是否包含给定的字符串而不会弄乱异常?》经验,为你挑选了2个好方法。



1> mfulton26..:

enumContains

您可以创建一个enumContains类似的功能猎犬的答案,但使用具体化的类型参数来代替.

您无法在Kotlin 1.0中创建独立于JVM的解决方案,但您可以在Kotlin 1.1中使用enumValues.

科特林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}
}

科特林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函数.

科特林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 }
}

科特林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")


是的,使用`reified`要好得多(在KClass上有一个扩展功能不是很漂亮!).在一个半相关旁注,用`enumConstants`一起,1.1带来的是[反射好东西]一整袋(https://github.com/JetBrains/kotlin/commit/ed1490dbc43f88696f82e5307df43269ecbb32b1)!

2> Januson..:

您可以只values使用您的枚举数组,并在其中使用包含。例如:

Planets.values().map { it.name }.contains("EARTH")

但是为此,您需要具有正确的字符串值,以便在搜索之前将其大写。

如果要按其值查找枚举,请查看反向查找枚举。

编辑:

正如@JamesBassett所建议的那样,您可以对其进行优化以使其在找到匹配项后停止查找。

Planets.values().any { it.name == "EARTH" }


我可能会简化为`Planets.values()。any {it.name ==“ EARTH”}`(您希望它在找到匹配项后就停止查找,而不是查看整个列表)
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有