使用 lambda 重构 Kotlin 方法

Refactoring Kotlin method using a lambda

我有以下 emun class 来表示我的导航栏视图。

enum class NavigationPosition(val position: Int, val id: Int) {
    HOME(0, R.id.nav_home),
    SEARCH(1, R.id.nav_search),
    PROFILE(2, R.id.nav_profile),
    SETTINGS(3, R.id.nav_settings);
}

我目前正在使用以下方法按位置进行反向查找

fun getByPosition(position: Int): NavigationPosition = when (position) {
    0 -> NavigationPosition.HOME
    1 -> NavigationPosition.SEARCH
    2 -> NavigationPosition.PROFILE
    3 -> NavigationPosition.SETTINGS
    else ->  NavigationPosition.HOME
}

var navigationPosition = getByPosition(position)

有没有更简单的方法可以通过使用 Kotlin lambda 或扩展函数来重构 getByPosition

我想你想要这个:

NavigationPosition.values()[position]

NavigationPosition.values() 是一个包含枚举值的数组。

所以你可以通过以下方式获得相同的结果:

fun getByPosition(position: Int): NavigationPosition  {
    return if (position >= NavigationPosition.values().size)
        NavigationPosition.HOME
    else
        NavigationPosition.values()[position]
}

如前所述,您可以使用 NavigationPosition.values()但是, 目前提出的方法内存效率不高。 。我强烈建议您将它缓存在一个静态变量中,以确保它不会在您每次调用它时都被初始化,因为这样效率不高。

将比较方法与缓存方法相结合,您可以在枚举中使用伴生对象。现在,就像我说的,缓存值是最好的选择,所以除了方法(如其他答案中所述)之外,您还创建了一个包含值的字段,以避免每次调用时都重新调用它方法。

companion object {
    private val values = values()
    fun getPositionById(id: Int) = if(id < values.size && id >= 0) values[i] else HOME
}