find key in map vs firstOrNull inKotlin[关闭]

0yg35tkg  于 2023-05-07  发布在  Kotlin
关注(0)|答案(2)|浏览(148)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

昨天关门了。
Improve this question
我有一个枚举类,我想找到枚举。

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()]
    }
}

哪个是惯用选项还是其他选项

y53ybaqx

y53ybaqx1#

TL;DR:使用第二种方法。
还请注意,在Kotlin1.9中,将有a new Kotlin way来访问这些条目(entries属性而不是values()函数)。它应该已经在preview right now in 1.8.21中了。
至于你的问题,你提到的方法之间有一些显着的差异:

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

第一点是相当重要的。尽管第一种方法可读性稍强,但它也是非常本地化的,因此不必经常阅读。所以我肯定会选择第二种方法。

ioekq8ef

ioekq8ef2#

从惯用的Angular 来看,这两个选项都是惯用的。
但从性能方面来看,第二种选择更高效,因为它使用Map来存储值,并允许常数时间查找(第一种允许线性时间查找)

相关问题