解构:日常中简单的小语法,方便,快速,简洁的使用对象中的属性。
data class Person(
val name: String,
val age: Int
)
val (name, age) = Person("sir", 24)
println(name)
println("$age")
如上,一个解构声明创建了2个新的变量,name,age,并且可以单独的使用它们。
原理解析
如上代码,经过反编译为java代码后,关键部分如下所示:
public final String component1() {
return this.name;
}
public final int component2() {
return this.age;
}
public static final void main() {
Person var2 = new Person("sir", 24);
String var0 = var2.component1();
int age = var2.component2();
}
- 也就是:
val name = person.component1(); val age = person.conponent2() - 由反编译的结果可知,data数据类默认实现了
componentN()函数
注意,componentN()函数需要使用
operator(重载)关键字进行标记,已允许在解构声明中使用它们。
普通类如何做到可解构
class Book(var title: String, var price: Float) {
operator fun component1(): String = title
operator fun component2(): Float = price
}
拓展
在lambda表达式中也经常可以使用解构:
{ a //-> …… } // 一个参数
{ a, b //-> …… } // 两个参数
{ (a, b) //-> …… } // 一个解构对
{ (a, b), c //-> …… } // 一个解构对以及其他参数