Kotlin: Return can be lifted out of 'when'

后端 未结 3 1219
清歌不尽
清歌不尽 2021-02-05 01:58

The alternative to switch in Kotlin is when. So, inside a recycler view adapter, when I am returning view type, I use when:



        
相关标签:
3条回答
  • 2021-02-05 02:08

    You’re using when like a simple Java switch statement, which is okay but not very idiomatic and can be improved. You can refactor your code in two steps:

    1. Kotlin's when can be used as an expression, it returns a value if you wish:

      override fun getItemViewType(position: Int): Int {
          return when (position) {
              0 -> ItemViewType.TITLE.type
              1 -> ItemViewType.SUBTITLE.type
              2 -> ItemViewType.ITEM.type
              else -> -1
           }
      }
      
    2. The function body, now consisting of a single statement, can be changed into an expression body:

      override fun getItemViewType(position: Int) = when (position) {
           0 -> ItemViewType.TITLE.type
           1 -> ItemViewType.SUBTITLE.type
           2 -> ItemViewType.ITEM.type
           else -> -1
      }
      
    0 讨论(0)
  • 2021-02-05 02:09

    Your when is correct, however Kotlin has the ability to lift the return out of the 'when' if you are returning in every case, thus it becomes :

    override fun getItemViewType(position: Int): Int {
        return when (position) {
            0 -> ItemViewType.TITLE.type
            1 -> ItemViewType.SUBTITLE.type
            2 -> ItemViewType.ITEM.type
            else -> -1
        }
    }
    
    0 讨论(0)
  • 2021-02-05 02:18

    In Kotlin, several statements, including if, when and try, can return a value. So in your case, you can refactor the statement to have the when statement return the actual value, which you can then return from the function.

    So, you can simplify your method to the following:

    override fun getItemViewType(position: Int): Int = when (position) {
        0 -> ItemViewType.TITLE.type
        1 -> ItemViewType.SUBTITLE.type
        2 -> ItemViewType.ITEM.type
        else -> -1
    }
    
    0 讨论(0)
提交回复
热议问题