lambda - 使用 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 或扩展函数进行重构?
解决方案
如前所述,您可以使用NavigationPosition.values()
. 然而,目前提出的方法不是内存效率的。每次调用 values 函数时都会创建一个新数组。我强烈建议您将其缓存在静态变量中,以确保每次调用它时都不会对其进行初始化,因为这样做效率不高。
将比较方法与缓存方法相结合,您可以在枚举中使用伴随对象。现在,就像我说的那样,缓存值是这里最好的选择,所以除了一个方法(如其他答案中提到的)之外,您还创建一个包含值的字段,以避免每次调用时都重新调用它方法。
companion object {
private val values = values()
fun getPositionById(id: Int) = if(id < values.size && id >= 0) values[i] else HOME
}
推荐阅读
- python - Numpy:从 JSON 文件加载数据会给出带有嵌套列表的 np 数组
- javascript - Passport.js 本地策略 + bcrypt + 散列密码存储在 dotenv 环境变量中 - 这是一种安全的方法吗?
- sql-server - 如何在 Visual Studio 2019 中将表和数据导入 SQL Server 数据库项目
- amazon-web-services - 用于高读取 IO/s 的 Elasticache 设置
- python - 导入 pywinauto 包时 Python 已停止工作,即使我没有使用它
- r - 如何将时间以分钟为单位:秒格式转换为秒?
- ios - 如何在 iOS 中为不同的导出方法和配置文件设置 fastlane?
- linux - hadoop start-dfs.sh 的 systemd 服务
- javascript - 在线 HTML 编辑器如何防止来自无效用户代码的错误?
- python - 使用 Python 让用户登录到网络中的每台计算机