Kotlin(1.1)學習筆記(13)——解構

我們有一個數(shù)據(jù)類Persion
data class Persion(var name:String,var age: Int,var sex: String){ }

我們如果想獲取其中的一些屬性,除了對象的get方法外,可以使用解構。

        var rhett = Persion("Rhett", 24, "M")
        var (name) = Rhett
        LogUtils.d(TAG, "name is $name")//這里輸出Rhett

在數(shù)據(jù)類中我們知道,編譯器會對主構函數(shù)中的參數(shù)進行推斷產生componentN()等一系列函數(shù),本例中在解構的時候他們就會被分解成

val name = rhett .component1()
val age = rhett .component2()
val sex= rhett .component3()
  1. 解構是按參數(shù)的順序進行的
    上面的例子中,如果我們只想知道Rhett的年齡和性別
//錯誤方式
 var (age, sex) = Rhett
LogUtils.v(TAG, "age = $age,set is $sex")//打印的信息:age = rhett,set is 24
  1. 自定義解構
    除了主構函數(shù)中的參數(shù),我們也可以為其他屬性定義解構函數(shù)
data class Persion(var name:String,var age: Int,var sex: String){
        var email: String ?=null
        operator fun component4(): String? {
            return email
        }
}

解構函數(shù)要用opetator標明,同時后面的序號如果寫錯,android studio會幫我們報錯,注意不要寫錯

  1. 自定義類型屬性
    如果屬性是自定義類型A的實例,解構的是A.toString()方法
  2. 映射(map)
    官方解釋的已經(jīng)比較詳細,我就不班門弄斧,直接來中文官網(wǎng)的解釋.

可能遍歷一個映射(map)最好的方式就是這樣:
for ((key, value) in map) {
// 使用該 key、value 做些事情
}
為使其能用,我們應該通過提供一個 iterator() 函數(shù)將映射表示為一個值的序列,
通過提供函數(shù) component1() 和 component2() 來將每個元素呈現(xiàn)為一對。
當然事實上,標準庫提供了這樣的擴展:

operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()

因此你可以在 for-循環(huán)中對映射(以及數(shù)據(jù)類實例的集合等)自由使用解構聲明。

就按照普通的Iterable對象處理就好

  1. 下劃線用于未使用的變量
    我們在1中說道,必須按照順序進行解構,從1.1之后我們可以_代替我們不需要使用的變量,1中錯誤的例子我們就可以改為var (_,age, sex) = Rhett就不會出錯了
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容