Kotlin學習筆記(十)解構宣告
阿新 • • 發佈:2019-02-02
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)
}
}