您的位置:首页 > 其它

Kotlin学习笔记(十)解构声明

2017-06-15 16:08 465 查看
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)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kotlin 解构声明