解构声明的作用:展开单个复合值。
一个解构声明看起来像一个普通的变量声明,但它在括号中有多个变量
1、解构声明举例:
val p = Point(10,20) //Point 是数据类
val(x, y) = p //将对象 p 解构
println(x) //10
println(y) //20
2、约定
解构声明中初始化每个变量时,调用的是名为 componentN 的函数,其中 N 是声明中变量的位置(即 componentN 函数使用到了约定的原则)。
val(a, b) = p
相当于
val a = p.component1()
val b = p.component2()
3、解构声明使用场景
1)从一个函数返回多个值
例子:
//将一个文件名分割成名字和扩展名
data class NameComponents(val name:String, val extension:String)
fun splitFileName(fullName: String): NameComponents{
val result = fullName.split('.', limit=2)
return NameComponents(result[0], result[1])
}
// 使用该函数
// 因为数据类自动声明 componentN() 函数,所以这里可以用解构声明
fun main(args:Array<String>){
val (name, extension) = splitFileName("example.kt")
}
对于数据类,编译器为每个在主构造方法中声明的属性生成一个 componentN 函数,下面是手动为非数据类型声明:
class Point(val x:Int, val y:Int){
operator fun component1() = x
operator fun component2() = y
}
2)用于 in 循环
枚举 map 中的条目:
fun printEntries(map: Map<String, String>){
for((key, value) in map) {
println("$key -> $value")
}
}
fun main(args:Array<String>){
val map = mapOf("Oracle" to "Java", "JetBrains" to "Kotlin")
printEntries(map)
}