Kotlin中的解構(gòu)聲明

前言

Kotlin是一種在Java虛擬機上運行的靜態(tài)類型編程語言,被稱之為Android世界的Swift,在GoogleI/O2017中,Google宣布Kotlin成為Android官方開發(fā)語言

什么是解構(gòu)聲明

把一個對象可以解構(gòu)成多個對象的聲明方式叫做解構(gòu)聲明

解構(gòu)聲明的使用

data class Person(val name: String, val age: Int)
class Call{
    fun test(){
        val (name,age) = Person("Mike",28)
        println(name)
        println(age)
    }
}

其中(name,age)就是解構(gòu)的聲明方式,并且打印結(jié)果是

Mike
28

結(jié)構(gòu)聲明只能在局部變量
如果聲明在成員變量會提示
destructuring declarations are only allowed for local variables/values
結(jié)構(gòu)聲明默認只支持data數(shù)據(jù)類對象,普通類不支持
當我們使用解構(gòu)聲明時,編譯器會生成這樣的代碼

fun test(){
    val (name,age) = Person("Mike",28)
}
//編譯后
public final void test() {
    Person var3 = new Person("Mike", 28);
    String var1 = var3.component1();
    int age = var3.component2();
}
data class Person(val name: String, val age: Int)
//編譯后
public final class Person {
    @NotNull
    private final String name;
    private final int age;
    public Person(@NotNull String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    @NotNull
    public final String component1() {
        return this.name;
    }

    public final int component2() {
        return this.age;
    }
}

name就相當于是component1()的返回值,age就相當于是component2()的返回值,并且這兩個函數(shù)都是data class編譯后直接產(chǎn)生的,所以可以可以直接使用解構(gòu)的方式聲明,普通類如果需要使用解構(gòu)聲明則需要手動定義這些函數(shù)

class Person(val name: String,val age: Int){  
operator fun component1(): String { return name }
operator fun component2(): Int { return age }
}
class Call{
    fun test(){
        val (name,age) = Person("Mike",28)
    }
}

使用解構(gòu)聲明在循環(huán)和lambda中
可以直接使用解構(gòu)聲明的方式接收元素

fun test() {
    val persons = listOf<Person>(Person("張三", 11), Person("", 12), Person("Mike", 13))

    for ((name, age) in persons) {
    }
    persons.forEach { (name, age) ->
    }
}

用于函數(shù)返回多個變量

data class CallResult(val errorCode:Int,val errorMsg:String)

fun httpCall():CallResult{
    val errorCode = 500
    val errorMsg = "End of Stream"
    return CallResult(errorCode,errorMsg)
}

val (errorCode,errorMsg) = httpCall()

解構(gòu)中不使用的變量
使用-表示不使用的變量,編譯器則不會生成此變量

val (name,_) = Person(“Mike”,28)

注意點
需要注意,在進行解構(gòu)聲明時,命名的位置會和數(shù)據(jù)類的變量位置對應(yīng),防止解構(gòu)變量命名位置放反,造成不必要的麻煩

data class Person(val name: String, val age: Int)
fun test(){
    val (age,name) = Person(“Mike”,28)//位置放反使用起來會造成混淆
}

歡迎關(guān)注Mike的簡書

Android知識整理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容