使用 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
}
我有以下 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
}