我有一个枚举类,我想找到枚举.

enum class Stage(val title: String) {
    ONE("one"),
    TWO("two");

    companion object {
        // 1st option
        fun fromTitle(title: String)  {
            values().firstOrNull { it.title.equals(title, true) }
        }

        // 2nd option
        private val mapByTitle = Stage.values().associateBy(Stage::title)
        fun fromTitle(title: String) = mapByTitle[title.lowercase()]
    }
}

哪一个是惯用选项,还是其他选项?

推荐答案

TL;DR:使用第二种方法.


还请注意,在Kotlin 1.9中,将有a new Kotlin way个条目访问这些条目(entries属性而不是values()函数).它应该已经在preview right now in 1.8.21房间了.

关于你的问题,你提到的方法之间有几个显著的区别:

  • 使用values()将在每次调用时创建一个新数组,因此如果重复调用第一个选项将创建一组数组(这应该由我提到的新Kotlin特性来解决)
  • 使用firstOrNull是在条目列表中的线性搜索,而使用映射允许持续访问枚举值,理论上,对于具有大量条目的大型枚举,这应该会更快,尽管在测量之前我不会太担心这个特定问题

第一点是相当重要的.尽管第一种方法的可读性稍好一些,但它也是非常本地化的,因此不必经常阅读.因此,我肯定会 Select 第二种方法.

Kotlin相关问答推荐

在Kotlin中,有没有一种函数方法将一个列表(N个元素)映射到一个相邻元素之和列表(N—1个元素)?

Kotlin中的增广赋值语句中的难以理解的错误

Android Jetpack编写androidx.compose.oundation.lazy.grid.Items

相当于roomdb中的DateTime Bigint列的是什么

哪个更好? Integer.valueOf(readLine()) 或 readLine()!!.toInt()

Kotlin 说不需要强制转换,但删除后会出现新警告

Spring Boot Kotlin 数据类未使用 REST 控制器中的默认值初始化

为什么没有remember 的 mutableStateOf 有时会起作用?

未为任务启用 Gradle 构建缓存

Kotlin 静态函数:伴生对象,@JvmStatic @JvmField

`DataBindingUtil` 中的 `bind`、`inflate` 和 `setContentView` 有什么区别

无法在 kotlin android 中以编程方式禁用 EditText

无法解决:androidx.lifecycle:lifecycle-viewmodel-ktx:1.1.1

Kotlin:什么是 kotlin.String!类型

Kotlin解构when/if语句

Kotlin中具有多个参数的绑定适配器

用于代码生成的ANTLR工具版本4.7.1与当前运行时版本4.5.3不匹配

IllegalStateException:function = , count = 3, index = 3

Android studio,构建kotlin时出现奇怪错误:生成错误代码

如何在 Kotlin 中定义新的运算符?