为什么会有
在java中,我们需要一个构造一个对象并且可能会用到构造对象时的参数,例如
int age = 22;
String name = "Tom";
Person p = new Person(age,name);
Log.d(TAG,name);
Kotlin 提供一个更为简洁的用法
怎么用
还是那个例子,一个Person类,里面有 age 和 name 俩个字段
fun main(args: Array<String>) {
val personD = PersonD(23,"Mike")
val (age3,name3) = personD
println("My name is $name3,I am $age3 ")
// 输出: My name is Mike,I am 23
}
data class PersonD(val age : Int, val name: String){
fun printName(){
print(name)
}
}
同过这样的语法,就直接定义好了俩个变量了,但是我们可以看到PersonD类,前面有个data 关键字,是个数据类,数据类自带解构方法——componentN(),非数据类需要自己重写component()方法:
class PersonT(val age : Int, val name: String){
fun printName(){
print(name)
}
operator fun component2(): Any { return name }
operator fun component1(): Any { return age }
}
重写后就可以像数据类一样使用解构语法了
在Map上使用
for ((key, value) in map) {
...
}
看下官方文档
为使其能用,我们应该
- 通过提供一个 iterator() 函数将映射表示为一个值的序列;
- 通过提供函数 component1() 和 component2() 来将每个元素呈现为一对。
标准库提供的拓展:
operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
operator fun <K, V> Map.Entry<K, V>.component1() = getKey()
operator fun <K, V> Map.Entry<K, V>.component2() = getValue()
因此你可以在 for-循环中对映射(以及数据类实例的集合等)自由使用解构声明。
有点看晕了,做个小测试:
val map = HashMap<String,String>()
map["1"] = "1"
map["2"] = "2"
map["3"] = "3"
for ((k,v) in map){
println("key is $k,data is $v")
}
val perlist = ArrayList<PersonD>()
perlist.add(PersonD(20,"Tom","GD"))
perlist.add(PersonD(21,"Tony","GX"))
perlist.add(PersonD(22,"Mike","HK"))
for ((age,name,area) in perlist){
println("age is $age,name is $name,area is $area")
}
// 打印结果:
key is 1,data is 1
key is 2,data is 2
key is 3,data is 3
age is 20,name is Tom,area is GD
age is 21,name is Tony,area is GX
age is 22,name is Mike,area is HK
结论:map系统已经实现了相应的方法,在 带有 data关键字的数据类,也可以放心的使用解构语法
官方文档参考:地址