本文是研究官方
core-ktx库的第三篇文章
,旨在探究该库中有哪些工具类或方法能够提高我们的开发效率。
前两篇文章的参考链接如下:
本篇文章主要是研究
core-ktx
库对SparseArray
系列和Pair
开发能代码哪些便利!!
SparseArray
系列
SparseArray
、LongSparseArray
系列就是一种支持key-value
数据结构形式读写的封装类,相比较于HashMap
的有点有两个:
- 键值
key
是一个基本数据类型,而不是一个基本数据类型对应的封装类,不需要装箱
- 它的数据结构是键值
key
一个数组,value
值一个数组,不像HashMap
,基于Entry
对key-value
进行封装再进行读写
PS:Android中还存在另一系列集合
SparseIntArray
、SparseBooleanArray
、SparseLongArray
,这些集合更厉害,key和value都是基本数据类型
,不需要装箱,不要和上面的集合搞混了。不过这两种集合core-ktx
提供的扩展封装都几乎相同,就不单独进行一一阐述了。
-
SparseArray<T>.size()
获取集合大小这个没什么新奇,就是对
SparseArray
原来获取大小的方式size()
进行了一层封装,借助于kotlin的语法糖,可以当成属性
的形式调用(本质上还是调用的方法
):private fun test5() { val sparseArray: SparseArray<String> = SparseArray<String>() val size = sparseArray.size } 复制代码
-
SparseArray<T>.contains(key: Int)
判断包含指定key
可以看到这个方法使用了
operator
修饰,是一个运算符重载方法,重载了运算符in
,使用如下:@RequiresApi(Build.VERSION_CODES.R) private fun test5() { val sparseArray: SparseArray<String> = SparseArray<String>() val isContain = 5 in sparseArray } 复制代码
不过这个api要求
SDK>=30
才能使用,我们可以直接将源码copy到项目工具类库中使用即可。 -
SparseArray<T>.plus(other: SparseArray<T>)
并合并两个集合为一个新集合这也是一个运算符重载函数,重载了运算符
+
,项目中可以这样使用:private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() val sparseArray2: SparseArray<String> = SparseArray<String>() val newArray = sparseArray1 + sparseArray2 } 复制代码
-
SparseArray<T>.containsValue(value: T)
判断是否存在指定value
这个和上面的
contains
方法类似,不过这个是判断某个value值是否在该集合中,同样也是重载了运算符in
-
SparseArray<T>.set(key: Int, value: T)
写入数据重载了运算符
[]
的函数,可以这样向集合中写入数据:private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1[10] = "" } 复制代码
-
SparseArray<T>.getOrDefault(key: Int, defaultValue: T)
带默认值的读值这个方法和
HashMap
的getOrDefault()
类似,当获取的值为null时,就返回默认值:private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1.getOrDefault(10, "null") } 复制代码
-
SparseArray<T>.getOrElse(key: Int, defaultValue: () -> T)
带默认函数类型返回值的读值这个和上面的
getOrDefault()
比较像,只不过提供默认值的不再是一个固定的具体类型的值,而是一个灵活的函数类型,我们可以在这个函数类型中进行额外的逻辑编写:private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1.getOrElse(10) { val tmp = "哈哈哈${sparseArray1.size}" tmp } } 复制代码
-
SparseArray<T>.isEmpty()
判断集合是否为空的 -
SparseArray<T>.remove(key: Int, value: T)
移除指定key-value
-
SparseArray<T>.forEach(action: (key: Int, value: T) -> Unit)
遍历使用:
private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1.forEach { key, value -> //执行操作 } } 复制代码
-
SparseArray<T>.keyIterator()
遍历键值key
这个方法会返回一个迭代器,这样我们就可以使用
for in
来遍历键值key
了:private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() for (key in sparseArray1.keyIterator()) { //执行操作 } } 复制代码
自定义迭代器就可以帮助我们实现通过
for in
关键字遍历,具体的可以参考我之前写的一篇文章:你需要懂的Kotlin开发技巧之八#运算符重载for in
。 -
SparseArray<T>.valueIterator()
遍历value使用起来和上面的
keyIterator()
方法类似。
Pair<F, S>
系列
-
componentX()
解构这也是一个
operator
修饰的运算符重载函数,关于这个解构
,我不太该怎么去用语言来描述,大家直接看下使用吧:private fun test6() { val pair = Pair(10, "ha") val (key, value) = pair } 复制代码
就是可以直接将这个对象的内部属性赋值给局部声明的变量,如果你只使用key或value,可以将不想要解构的属性使用
_
代替:val (key , _) = pair //只使用key
这个结构的扩展方法是专门给
Java
(包括android和androidX包下的)的Pair
对象提供的,而Kotlin
自己实现的Pair
是不需要的,因为其声明的Pair
对象就是一个data class
,而data class
会默认给我们生成解构的方法:反编译成java代码就可以看到生成的
componentX()
系列方法。 -
java
与kotlin
的Pair
相互转换
-
toKotlinPair
将androidx包
的Pair
对象转成Kotlin
的Pair
对象 -
toAndroidXPair
将kotlin
的Pair
对象转成androidx包
的Pair
对象 -
toKotlinPair
将android包
的Pair
对象转成Kotlin
的Pair
对象 -
toAndroidPair
将kotlin
的Pair
对象转成android包
的Pair
对象
总结
详细的源码请自行参考core-ktx
包下的SparseArray.kt
、Pair.kt
、SparseXXXArray.kt
等文件源码。接下来就准备研究下core-ktx
的graphics
包下的关于View
操作的一些扩展工具了(好多好多类):
看下能为我们常见的View
开发带来哪些便利,请您敬请期待吧!!
我正在参与掘金技术社区创作者签约计划招募活动,点击链接报名投稿。