10.1数据解构
数据解构就是讲对象中的数据解析成相应的独立变量,也就是脱离原来的对象存在。
|
|
这行代码是一个Person数据类,该数据类有3个参数,下面的代码要将这3个参数对应的属性值赋给相应的3个变量。
|
|
运行结果:
|
|
如果想让一个函数返回多个值。并能解构这些值,也需要返回数据类对象。
|
|
调用deletePerson函数,并解构其返回值的代码如下:
|
|
有很多对象,可以保存一组值。例如Map。下面的代码创建MutableMap对象,并保存了两个key-value值对,然后通过for语句将其解构出来。
|
|
运行结果:
|
|
其中这些对象都是通过数据类实现的。例如,我们也可以自己来实现类似的功能。
|
|
执行一下:
|
|
运行结果:
|
|
10.2集合
Kotlin标准库将集合分为可修改和不可修改的。不可修改的集合API包括List、Set、Map,可修改的集合的API包括MutableList、MutableSet、MutableMap等。这些API都是接口,而且他们都是Collection的子接口。
如果泛型用out声明,那么该泛型只能用于读操作。
下面是一些集合常用的方式:
|
|
下面是一些常用的创建集合对象的函数。
- listOf:用于创建List对象
- setOf:用于创建Set对象
- mapOf:用于创建Map对象
- mutableListOf:用于创建mutable对象
- mutableSetOf:用于创建mutableSetOf对象
- mutableMapOf:用于创建mutableMapOf对象
对于可读写的集合,可以通过toXxx函数将其转换为只读的版本,其中Xxx是List、Set和Map。
|
|
10.3值范围
值范围表达式使用rangeTo函数实现,该函数的操作符形式是两个点(..),另外还有两个相关操作符in和!in。任何可比较大小的数据类型都可以定义值范围。
|
|
整数的值范围(IntRange、LongRange、CharRange)还有一种额外的功能,就是可以对这些值范围进行遍历。
|
|
执行这段代码会输出1到100内的10个数。
如果按照倒序输出,只需要使用标准库中的downTo函数即可。
|
|
如果要修改步长,就要使用step函数。
|
|
前面的代码中,使用的都是闭区间,1<=i<=10。如果要表示1<=i<10,需要使用until函数。
|
|
10.4类型检查和类型转换
is与!is操作符
is操作符:在运行时检查一个对象与一个给定的类型是否一致。!is与之相反。
|
|
如果is表达式满足条件,Kotlin编译器会自动转换is前面的对象到后面的数据类型,也就是说上面一个if语句中,obj已经是String类型了。
要注意的是,对象和is后面的类型要兼容,否则无法编译通过。
强制类型转换
如果类型强制转换,而且类型不兼容,类型转换操作符通常会抛出一个异常。因此,我们称之为不安全的,在Kotlin中,不安全的类型转换使用中缀操作符as。
|
|
注意:null不能被转换为String,因为这个类型不是可为null的。我们需要在类型转换操作符的右侧使用可为null的类型。
|
|
10.5this表达式
为了表示当前函数的接收者。可以使用this表达式。在类的成员函数中,this指向这个类的当前对象实例。在扩展函数中或者带接受者的函数字面值中,this代表调用函数时,在点号左侧传递的接收者参数。
如果this没有限定值,那么它指向包含当前代码的最内层范围,如果想要指向其他范围内的this,需要使用标签限定符。
为了访问更外层范围内的this,使用this@label,其中@label是一个标签,代表我们想要访问的this所属的范围。
|
|
10.6相等判断
在Kotlin中有两种相等判断。
- 引用相等,也即是两个引用指向同一个对象,使用”===”(以及他的相反操作!==)
- 结构相等,使用equals函数判断,使用”==”(以及他的相反操作!=)