我们有一个数据类Persion
data class Persion(var name:String,var age: Int,var sex: String){ }
我们如果想获取其中的一些属性,除了对象的get方法外,可以使用解构。
var rhett = Persion("Rhett", 24, "M")
var (name) = Rhett
LogUtils.d(TAG, "name is $name")//这里输出Rhett
在数据类中我们知道,编译器会对主构函数中的参数进行推断产生componentN()
等一系列函数,本例中在解构的时候他们就会被分解成
val name = rhett .component1()
val age = rhett .component2()
val sex= rhett .component3()
- 解构是按参数的顺序进行的
上面的例子中,如果我们只想知道Rhett的年龄和性别
//错误方式
var (age, sex) = Rhett
LogUtils.v(TAG, "age = $age,set is $sex")//打印的信息:age = rhett,set is 24
- 自定义解构
除了主构函数中的参数,我们也可以为其他属性定义解构函数
data class Persion(var name:String,var age: Int,var sex: String){
var email: String ?=null
operator fun component4(): String? {
return email
}
}
解构函数要用opetator标明,同时后面的序号如果写错,android studio会帮我们报错,注意不要写错
- 自定义类型属性
如果属性是自定义类型A的实例,解构的是A.toString()方法 - 映射(map)
官方解释的已经比较详细,我就不班门弄斧,直接来中文官网的解释.
可能遍历一个映射(map)最好的方式就是这样:
for ((key, value) in map) {
// 使用该 key、value 做些事情
}
为使其能用,我们应该通过提供一个 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-循环中对映射(以及数据类实例的集合等)自由使用解构声明。
就按照普通的Iterable对象处理就好
- 下划线用于未使用的变量
我们在1中说道,必须按照顺序进行解构,从1.1之后我们可以_
代替我们不需要使用的变量,1中错误的例子我们就可以改为var (_,age, sex) = Rhett
就不会出错了