You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:43:11