天天看點

Kotlin解構聲明

解構聲明其實也是一個很簡單的知識,就是為了使用的便利才有的,它可以将一個對象的屬性很友善的變為一個單獨的變量,比如有一個Weather的資料類,其含有日期、天氣詳情、氣溫三個屬性,假如現在我們想使用其中的氣溫屬性來計算月平均氣溫,最常用的方式是建立一個Weather的執行個體,然後使用執行個體名字加上氣溫屬性的名字來得到氣溫,如下:

val tempList = arrayListOf<Int>()
        //普通用法
  val weather = Weather("2017年11月26号,", 20, "多雲轉晴")
        tempList.add(weather.temp)
           

如果我們還想使用weather的其他的屬性每次都加上weather執行個體名字比較麻煩,如果我們使用解構聲明方式把執行個體解構為其它的變量那麼我們就可以直接使用變量名字來替代,如下:

val tempList = arrayListOf<Int>()
        //普通用法
        val weather = Weather("2017年11月26号,", 20, "多雲轉晴")
        val (_, temp) = weather
        tempList.add(temp)
           

這裡的val(_,temp)=weather就是解構聲明,其文法就是=的右邊是一個需要解構的對象,左邊就是聲明變量來接收右邊對象屬性解構後的值,與直接申明變量不同的是左邊變量的名字需要使用括号括起來。有一下幾點需要注意:

1、任何對象隻要有ComponentN元件函數,都可以用作解構對象放在=号的右邊

2、ComponentN元件函數就是component1、component2等等函數組成的函數,這種函數需要使用operator修飾符來修飾,否則不是元件函數。

3、=号左邊的括号中申明的變量的個數必須少于等于ComponentN元件函數的個數,也就是少于N(因為N代表的是元件函數的個數,從1開始計算)。

4、=号左邊的變量的順序與componentN的元件函數的順序是對應的,而預設的component的順序是屬性的聲明的順序。

5、如果=号左邊的變量有未使用到的變量可以使用“_”下劃線來代替,這樣就不會調用對應的元件函數。

6、=号左邊的變量的值其實就是簡單的調用對應component元件函數的傳回值。

7、data類型的類預設會有component函數,其個數就是屬性的個數,順序就是聲明的順序。

因為上面的Weather類我是聲明為data類了,是以預設就可以使用解構聲明,Weather的定義如下:

package com.xinxue.example.destructuringdeclarationdemo

/**
 * Created by Administrator on 2017/11/26.
 */
data class Weather(val date: String, val temp: Int, val info: String)
           

如果我們去掉data關鍵詞那麼上面的解構聲明就會報錯,類似下面這樣:

Kotlin解構聲明

要修複這個錯誤,我們隻需要給Weather類改成下面這樣:

class Weather(val date: String, val temp: Int, val info: String){
    
    operator fun component1():String{
        return  date
    }
   operator fun component2():Int{
        return temp
    }
    
}
           

當然這裡的傳回值我們改成任意的其他的值,比如給temp加一個溫度補償,傳回temp+1也是可以得,如下:

operator fun component2():Int{
        return temp+1
    }
           

總之一句話,隻要對象有component元件函數,我們就可以對對象的執行個體使用解構聲明。

使用解構聲明來周遊map集合

我們在周遊map集合時可以使用解構聲明,如下:

for ((key, value) in map) {
   // 使用 key 和 value 執行某種操作
}
           

這樣我們就可以直接擷取到對應的key和value值,當然這裡括号的變量我們可以使用其他的名字來代替.

總結

結構聲明就一句話:給一個含有N個元件函數(component)的對象分解為少于等于N個變量的功能,而實作這樣一個功能隻需要一個表達式就可以(val (a,b,c)=Weather())。

歡迎關注微信公衆号“android教科書”,最新最好的文章第一時間送到手!掃描下面的二維碼即可:

Kotlin解構聲明