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()//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学习笔记)