Kotlin 解构声明

为什么会有

在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关键字的数据类,也可以放心的使用解构语法

官方文档参考:地址

发布了27 篇原创文章 · 获赞 6 · 访问量 1662

猜你喜欢

转载自blog.csdn.net/weixin_41802023/article/details/100132604