首页 > 解决方案 > 使用 lambda 重构 Kotlin 方法

问题描述

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

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)

getByPosition有没有更简单的方法可以使用 Kotlin lambda 或扩展函数进行重构?

标签: lambdakotlinkotlin-extension

解决方案


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

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

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

推荐阅读