【问题标题】:Refactoring Kotlin method using a lambda使用 lambda 重构 Kotlin 方法
【发布时间】:2018-11-23 18:23:48
【问题描述】:

我有以下 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)

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

【问题讨论】:

    标签: lambda kotlin kotlin-extension


    【解决方案1】:

    如前所述,您可以使用NavigationPosition.values()然而,目前提出的方法并不高效。 values function creates a new array every time it is called。我强烈建议您将其缓存在静态变量中,以确保每次调用它时都不会对其进行初始化,因为这样做效率不高。

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

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

    【讨论】:

      【解决方案2】:

      我想你想要这个:

      NavigationPosition.values()[position]
      

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

      因此,您可以通过以下方式获得相同的结果:

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

      【讨论】:

        猜你喜欢
        • 2018-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多