1. 程式人生 > >快速學習Kotlin(五)解構

快速學習Kotlin(五)解構

在kotlin中所謂的解構就是將一個類物件中的引數拆開來,成為一個一個單獨的變數,從而來使用這些單獨的變數進行操作。

data class Person1(var name:String,var age:Int){

}


fun function1(){
    var person:Person1 = Person1("Mike",20);
    var (name,age) = person;
    println("his name is $name,and his age is $age");
}

從上面程式碼看到,我們首先聲明瞭一個類Person1,其構造方法裡面有兩個引數name和age。之後我們將Person1類例項化給person這個物件。可以看到之後在“var (name,age) = person;”,這個就是在進行解構;將person中的"Mike和20"提取出來賦值給後來的name與age,之後列印name和age,其值就變成了Mike和20了。

解構這個方式在平時使用的時候更多的是使用在集合的遍歷或者說是對Map的遍歷中。

data class Person1(var name:String,var age:Int){

}


fun function(){
    var person1 : Person1 = Person1("Mike",20);
    var person2 : Person1 = Person1("Jack",21);
    var person3 : Person1 = Person1("John",23);
    var person4 : Person1 = Person1("Helen",25);
    var person5 : Person1 = Person1("Dick",30);
    var list = listOf<Person1>(person1,person2,person3,person4,person5);
    for ((name,age) in list){
        print("name is $name,age is $age");
    }
}

看到,在這裡我們例項化了很多個Person1的物件,並且每個物件在構造方法中都傳入了不同的值;之後將這些物件新增進入list集合中,通過for迴圈來遍歷整個list集合,從而取出name和age的值。

自定義componentN

我們已經瞭解到編譯器會根據主構造器中宣告的全部屬性, 自動推斷產生componentN() 函式群。但,對於普通類的成員屬性,編譯器並不會自動推斷產生componentN() ,此時componentN(),需要我們自己定義了。

在Person類中,聲明瞭一個成員屬性mobile。對於mobile,我們這裡自定義了componentN().

data class Person(var name: String, var age: Int, var addr: String) {
        var mobile: String ?= null

    operator fun component4(): String {
        return this.mobile!!
    }
}

fun main(args: Array<String>) {
    var person: Person = Person("Jone", 20, "ShangHai")

    person.mobile = "147323"

    var (name, age, addr, mobile) = person
    println("name: $name, age: $age, addr: $addr, mobile: $mobile")
}

// Log
name: Jone, age: 20, addr: ShangHai, mobile: 147323

對於自定義的componentN(),需要注意以下幾點:

  1. componentN()函式需要標記為 operator , 才可以在解構宣告中使用
  2. componentN()函式的返回值型別必須與屬性型別一致

如果覺得我的文章能夠幫助到你,也歡迎關注我的微信公眾號「晨雨細曲」,有新技術和知識會推送在這上面。