天天看点

Kotlin解构声明

解构声明其实也是一个很简单的知识,就是为了使用的便利才有的,它可以将一个对象的属性很方便的变为一个单独的变量,比如有一个Weather的数据类,其含有日期、天气详情、气温三个属性,假如现在我们想使用其中的气温属性来计算月平均气温,最常用的方式是创建一个Weather的实例,然后使用实例名字加上气温属性的名字来得到气温,如下:

val tempList = arrayListOf<Int>()
        //普通用法
  val weather = Weather("2017年11月26号,", 20, "多云转晴")
        tempList.add(weather.temp)
           

如果我们还想使用weather的其他的属性每次都加上weather实例名字比较麻烦,如果我们使用解构声明方式把实例解构为其它的变量那么我们就可以直接使用变量名字来替代,如下:

val tempList = arrayListOf<Int>()
        //普通用法
        val weather = Weather("2017年11月26号,", 20, "多云转晴")
        val (_, temp) = weather
        tempList.add(temp)
           

这里的val(_,temp)=weather就是解构声明,其语法就是=的右边是一个需要解构的对象,左边就是声明变量来接收右边对象属性解构后的值,与直接申明变量不同的是左边变量的名字需要使用括号括起来。有一下几点需要注意:

1、任何对象只要有ComponentN组件函数,都可以用作解构对象放在=号的右边

2、ComponentN组件函数就是component1、component2等等函数组成的函数,这种函数需要使用operator修饰符来修饰,否则不是组件函数。

3、=号左边的括号中申明的变量的个数必须少于等于ComponentN组件函数的个数,也就是少于N(因为N代表的是组件函数的个数,从1开始计算)。

4、=号左边的变量的顺序与componentN的组件函数的顺序是对应的,而默认的component的顺序是属性的声明的顺序。

5、如果=号左边的变量有未使用到的变量可以使用“_”下划线来代替,这样就不会调用对应的组件函数。

6、=号左边的变量的值其实就是简单的调用对应component组件函数的返回值。

7、data类型的类默认会有component函数,其个数就是属性的个数,顺序就是声明的顺序。

因为上面的Weather类我是声明为data类了,所以默认就可以使用解构声明,Weather的定义如下:

package com.xinxue.example.destructuringdeclarationdemo

/**
 * Created by Administrator on 2017/11/26.
 */
data class Weather(val date: String, val temp: Int, val info: String)
           

如果我们去掉data关键词那么上面的解构声明就会报错,类似下面这样:

Kotlin解构声明

要修复这个错误,我们只需要给Weather类改成下面这样:

class Weather(val date: String, val temp: Int, val info: String){
    
    operator fun component1():String{
        return  date
    }
   operator fun component2():Int{
        return temp
    }
    
}
           

当然这里的返回值我们改成任意的其他的值,比如给temp加一个温度补偿,返回temp+1也是可以得,如下:

operator fun component2():Int{
        return temp+1
    }
           

总之一句话,只要对象有component组件函数,我们就可以对对象的实例使用解构声明。

使用解构声明来遍历map集合

我们在遍历map集合时可以使用解构声明,如下:

for ((key, value) in map) {
   // 使用 key 和 value 执行某种操作
}
           

这样我们就可以直接获取到对应的key和value值,当然这里括号的变量我们可以使用其他的名字来代替.

总结

结构声明就一句话:给一个含有N个组件函数(component)的对象分解为少于等于N个变量的功能,而实现这样一个功能只需要一个表达式就可以(val (a,b,c)=Weather())。

欢迎关注微信公众号“android教科书”,最新最好的文章第一时间送到手!扫描下面的二维码即可:

Kotlin解构声明