目录
1、解构的定义
2、operator
3、解构的实现
4、数据类自动解构
5、使用场景
6、小技巧
解构的意思就是将一个被初始化的对象,将它们的属性按顺序解构出来。
下面我定义了一个Animal的类,它的属性,分别是name,age,height。
如果想将一个person对象的属性解构出来的话,必须使用component1()操作符将属性值解构出来。
component1(),component2()等函数是Kotlin约定的操作符(类似+ - * / for等操作符)
class Animal(val name: String, val age: Int) {
var height:Int = 0
operator fun component1(): String = name
operator fun component2(): Int = age
operator fun component3(): Int = height
}
解构出来的结果
fun main() {
val animal = Animal("小白", 3)
animal.height=120
//解构语句
val (animalName: String, animalAge: Int,animalHeight) = animal
println("animalName=$animalName")
println("animalAge=$animalAge")
println("animalHeight=$animalHeight")
}
//输出结果
animalName=小白
animalAge=3
animalHeight=120
编译器会为数据类(data class)自动声明/定义componentN()函数,可直接用解构声明!
data class Dog(val name: String, val age: Int)
fun main() {
val dog = Dog("小黑", 2)
//解构语句
val (dogName: String, dogAge: Int) = dog
println("dogName=$dogName")
println("dogAge=$dogAge")
}
//输出结果
dogName=小黑
dogAge=2
fun returnName_Age(name: String): Dog {
val dog = Dog(name, 10)
return dog
}
var dogList= mutableListOf()
for ((name, age) in dogList) {
println("dogName=$dogName")
println("dogAge=$dogAge")
}
lambda 表达式中的参数类型可以有许多种,如果这些参数类型为 Pair类型、Map.Entry 或任何其他具有相应 componentN 函数的类型,那么可以通过将它们放在括号中实现一个可以被解构的参数。
map.mapValues { entry -> "${entry.value}!" }
map.mapValues { (key, value) -> "$value!" }
注意声明两个参数和声明一个解构对来取代单个参数之间的区别:
{ a //-> …… } // 一个参数
{ a, b //-> …… } // 两个参数
{ (a, b) //-> …… } // 一个解构对
{ (a, b), c //-> …… } // 一个解构对以及其他参数
如果解构的参数中的一个组件未使用,那么可以将其替换为下划线,以避免编造其名称:
map.mapValues { (_, value) -> "$value!" }
可以指定整个解构的参数的类型或者分别指定特定组件的类型:
map.mapValues { (_, value): Map.Entry -> "$value!" }
map.mapValues { (_, value: String) -> "$value!" }
除了用解构语句将对象属性解构出来输出以外,还可以直接调用被解构对象的componentN操作符将你想要的属性输出出来
val dog = Dog("小黑", 2)
val (dogName: String, dogAge: Int) = dog
println("dogName=$dogName")
println("dogName=${dog.component1()}")//和上面的输出结果一样
class Animal(val name: String, val age: Int) {
var height: Int = 0
operator fun component1(): String = name
operator fun component2(): Int = age
operator fun component3(): Int = height
}
//解构的属性顺序和component1、component2、component3的顺序是一样的
val (animalName: String, animalAge: Int, animalHeight) = animal
class Animal(val name: String, val age: Int) {
var height: Int = 0
operator fun component1(): String = name
operator fun component2(): Int = age
operator fun component3(): Int = height
}
//如果你不需要age属性,可以用_代替
val (animalName: String,_, animalHeight) = animal