1. 程式人生 > >Kotlin學習筆記(十)解構宣告

Kotlin學習筆記(十)解構宣告

Kotlin中,我們可以將一個物件解構成多個變數:

//資料類
data class Person(val name:String="Kotlin",val sex:String="男",val age:Int=1)

fun foo(){
    var (name,sex,age)=Person()//解構宣告
    print("name=$name&sex=$sex&age=$age")
}

這就是解構宣告。解構宣告可以一次宣告多個變數,任何表示式都可以出現在解構宣告的右側,只要我們可以對它呼叫所需數量的component函式(注意:componentN()函式需要用operator關鍵字修飾,以允許其在解構宣告宣告中使用它們)。資料類自動宣告component函式。

以上程式碼相當於:

//資料類
data class Person(val name:String="Kotlin",val sex:String="男",val age:Int=1)

fun foo(){
    //var (name,sex,age)=Person()
    var person=Person()
    var name=person.component1()//按照宣告順序返回person的第一個屬性值,即name屬性值
    var sex=person.component2()//按照宣告順序返回person的第二個屬性值,即sex屬性值
    var age=person.component3()//按照宣告順序返回person的第三個屬性值,即age屬性值
print("name=$name&sex=$sex&age=$age") }

通過解構賦值我們可以在一個函式中返回多個值,例如我們要返回一個name值,一個sex值和一個age值。我們可以這樣實現:首先我們根據要返回的值建立一個數據類,然後在函式中返回這個資料類,這樣間接我們就返回了多個數值:

//資料類
data class Person(val name:String="Kotlin",val sex:String="男",val age:Int=1)

fun foo3():Person{
    //do something
    return Person()//返回一個數據類物件
} fun printFoo3(){ var(name,sex,age)= foo3()//解構宣告賦值 }

我們也可以在for迴圈中使用解構宣告,只要集合中的每個元素提供有componentN()方法

var collections= arrayListOf<Person>()//list集合中元素要為其每個成員屬性提供有componentN方法
    for((name,sex,age) in collections){
        println("name=$name&sex=$sex&age=$age")
    }

我們也可以對對映使用解構賦值。因為map結構提供函式 component1() 和 component2() 來將每個元素呈現為一對。

var map= mutableMapOf<String,String>()
    map.put("name","Kotlin")
    map.put("sex","男")
    map.put("age","13")
    for ((key,value) in map){
        println("$key=$value")
    }

在解構宣告中你如果不需要某個變數,那麼可以用下劃線取代其名稱:

var (_,sex,age)=Person()//不需要使用的變數用下劃線代替

可以在lambda表示式中使用解構宣告。如果 lambda 表示式具有 Pair 型別(或者 Map.Entry 或任何其他具有相應 componentN 函式的型別)的引數,可以通過將它們放在括號中來引入多個新引數來取代單個新引數:

fun foo(person:Person,body:(person:Person)->Unit){
    body(person)
}

fun printFoo(person:Person){

    foo(person){
        person->//一個Person物件
        print("name="+person.name+"sex="+person.sex+"age="+person.age)
    }
//等價於
    foo(person){
        (name,sex,age)->//一個解構對
        print("name="+name+"sex="+sex+"age="+age)
    }
}