在kotlin中所谓的解构就是将一个类对象中的参数拆开来,成为一个一个单独的变量,从而来使用这些单独的变量进行操作。
data class Person1(var name:String,var age:Int){
}
fun function1(){
var person:Person1 = Person1("Mike",20);
var (name,age) = person;
println("his name is $name,and his age is $age");
}
从上面代码看到,我们首先声明了一个类Person1,其构造方法里面有两个参数name和age。之后我们将Person1类实例化给person这个对象。可以看到之后在“var (name,age) = person;”,这个就是在进行解构;将person中的"Mike和20"提取出来赋值给后来的name与age,之后打印name和age,其值就变成了Mike和20了。
解构这个方式在平时使用的时候更多的是使用在集合的遍历或者说是对Map的遍历中。
data class Person1(var name:String,var age:Int){
}
fun function(){
var person1 : Person1 = Person1("Mike",20);
var person2 : Person1 = Person1("Jack",21);
var person3 : Person1 = Person1("John",23);
var person4 : Person1 = Person1("Helen",25);
var person5 : Person1 = Person1("Dick",30);
var list = listOf<Person1>(person1,person2,person3,person4,person5);
for ((name,age) in list){
print("name is $name,age is $age");
}
}
看到,在这里我们实例化了很多个Person1的对象,并且每个对象在构造方法中都传入了不同的值;之后将这些对象添加进入list集合中,通过for循环来遍历整个list集合,从而取出name和age的值。
自定义componentN
我们已经了解到编译器会根据主构造器中声明的全部属性, 自动推断产生componentN() 函数群。但,对于普通类的成员属性,编译器并不会自动推断产生componentN() ,此时componentN(),需要我们自己定义了。
在Person类中,声明了一个成员属性mobile。对于mobile,我们这里自定义了componentN().
data class Person(var name: String, var age: Int, var addr: String) {
var mobile: String ?= null
operator fun component4(): String {
return this.mobile!!
}
}
fun main(args: Array<String>) {
var person: Person = Person("Jone", 20, "ShangHai")
person.mobile = "147323"
var (name, age, addr, mobile) = person
println("name: $name, age: $age, addr: $addr, mobile: $mobile")
}
// Log
name: Jone, age: 20, addr: ShangHai, mobile: 147323
对于自定义的componentN(),需要注意以下几点:
- componentN()函数需要标记为 operator , 才可以在解构声明中使用
- componentN()函数的返回值类型必须与属性类型一致
如果觉得我的文章能够帮助到你,也欢迎关注我的微信公众号「晨雨细曲」,有新技术和知识会推送在这上面。