解构声明:这个功能允许你展开单个复合值,并使用它来初始化多个单独的变量。
任何表达式都可以出现在解构声明的右侧,只要可以对它调用所需数量的 component 函数即可。
/**
* 要在解构声明中初始化每个变量,会调用名为componentN的函数,其中N是声明中变量的位置。
*/
class Point(val x: Int, val y: Int) {
/**
* 手动为非数据类实现解构功能
* 注意:componentN() 函数需要用 operator 关键字标记,以允许在解构声明中使用它们。
*/
operator fun component1() = x
operator fun component2() = y
}
fun main(args: Array<String>) {
val (x, y) = Point(10, 20)
println("x=$x,y=$y") // x=10,y=20
}
/**
* 对于数据类,编译器为每个在主构造方法中声明的属性生成一个componentN函数。
*/
data class Point2(val x: Int, val y: Int)
fun main(args: Array<String>) {
val (x, y) = Point2(10, 20)
println("x=$x,y=$y") //x=10,y=20
}
数据对象是一个数据容器,可以理解为多个相关数据被打包到一个对象中。
解构进行相反的操作,是将数据对象拆开将内部的属性取出,赋值给不同的变量。
解构不仅仅适用于数据对象,也适用于集合数组对象。
注意:对于数据对象,定义componentN函数的数量没有限制,但是对于集合数组只允许使用此语法来访问其对象中的前五个元素。
fun main(args: Array<String>) {
val person = Person("Jack",
20,
"male",
"Beijing",
"1234556",
"Jack@gmail.com",
false,
"Programmer")
val (name, age, sex, address, phone, email, marry, job) = person
println("""name=$name,
|age=$age,
|sex=$sex,
|address=$address,
|phone=$phone,
|email=$email,
|marry=$marry,
|job=$job""".trimMargin())
}
data class Person(val name: String,
val age: Int,
val sex: String,
val address: String,
val phone: String,
val email: String,
val marry: Boolean,
val job: String)
只允许访问集合的前五个元素:
Kotlin API中为集合定义了5个componentN函数:
