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