Kotlin中Map查找枚举与firstOrNull查找哪个更符合惯用写法?
Kotlin枚举根据Title查找实例的方案对比与最优实践
两种方案的特点
方案一:直接遍历枚举值匹配
这种写法通过values().firstOrNull遍历所有枚举实例,忽略大小写匹配title,实现简单直观:
enum class Stage(val title: String) { INIT("Init"), PROCESSING("Processing"), COMPLETED("Completed"); companion object { fun findByTitle(title: String): Stage? { return values().firstOrNull { it.title.equals(title, ignoreCase = true) } } } }
它的优势是代码简洁,不需要额外维护缓存结构;但每次调用都会遍历所有枚举值,频繁调用时会产生重复遍历的性能损耗,适合枚举实例数量极少的场景。
方案二:预构建映射Map
提前通过associateBy构建小写title与枚举实例的映射,后续查找直接从Map中取值:
enum class Stage(val title: String) { INIT("Init"), PROCESSING("Processing"), COMPLETED("Completed"); companion object { private val titleToStage = values().associateBy { it.title.lowercase() } fun findByTitle(title: String): Stage? { return titleToStage[title.lowercase()] } } }
这种方案的查找时间复杂度是O(1),频繁调用时性能更优;映射只会在枚举类加载时初始化一次,不会重复构建。唯一的“额外开销”是维护一个静态Map,但对于枚举来说这种成本几乎可以忽略。
哪种更符合Kotlin惯用写法?
两种写法都是Kotlin中合法且常用的实现,选择取决于你的使用场景:
- 如果枚举实例数量很少(比如个位数到十几个),方案一更贴合Kotlin“简洁优先”的风格,没必要为了微小的性能差异增加额外代码。
- 如果枚举实例较多,或者这个查找方法会被高频调用,方案二是更合理的性能优化实践,也是Kotlin中常见的预缓存写法。
更优方案:懒加载映射
如果想兼顾初始化效率和查找性能,可以用懒加载的方式构建映射,确保只在第一次调用查找方法时才初始化Map:
enum class Stage(val title: String) { INIT("Init"), PROCESSING("Processing"), COMPLETED("Completed"); companion object { private val titleToStage by lazy { values().associateBy { it.title.lowercase() } } fun findByTitle(title: String): Stage? { return titleToStage[title.lowercase()] } } }
这种方式既避免了枚举类加载时的不必要初始化,又保证了后续查找的高效性,是更平衡的最优方案。
内容的提问来源于stack exchange,提问作者Compose Learner
相关产品推荐
相关产品推荐

