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) }}