Este artículo es una investigación oficial
core-ktx库的第三篇文章
, con el objetivo de explorar qué clases de herramientas o métodos en la biblioteca pueden mejorar nuestra eficiencia de desarrollo.
Los enlaces de referencia para los dos primeros artículos son los siguientes:
¿Qué ventajas puede aportar la biblioteca oficial core-ktx al desarrollo que necesita saber?
¡ Este artículo es principalmente para estudiar la conveniencia de
core-ktx
la biblioteca paraSparseArray
series yPair
código de desarrollo! !
SparseArray
serie
SparseArray
,LongSparseArray
la serie es un tipo de clasekey-value
de encapsulación que admite lectura y escritura en forma de estructura de datos. En comparación conHashMap
ella, hay dos puntos:
- El valor clave
key
es un tipo de datos básico, no una clase contenedora correspondiente al tipo de datos básico, no es necesario装箱
- Su estructura de datos es una matriz de valores clave
key
y una matriz devalue
valores, a diferencia deHashMap
, basadaEntry
enkey-value
encapsulación y luego lectura y escritura .
PD: Hay otra serie de colecciones en Android
SparseIntArray
, estas colecciones son más poderosas,SparseBooleanArray
no necesitan boxeo, no las confundas con las colecciones anteriores. Sin embargo, los paquetes de extensión proporcionados por estas dos colecciones son casi iguales, por lo que no se explicarán individualmente.SparseLongArray
key和value都是基本数据类型
core-ktx
-
SparseArray<T>.size()
obtener el tamaño de la colecciónEsto no es nada nuevo, simplemente encapsula la
SparseArray
forma original de obtener el tamañosize()
. Con la ayuda del azúcar sintáctico de kotlin, se puede属性
llamar como (本质上还是调用的方法
):private fun test5() { val sparseArray: SparseArray<String> = SparseArray<String>() val size = sparseArray.size } 复制代码
-
SparseArray<T>.contains(key: Int)
El juicio incluye especificarkey
Puede ver que este método
operator
está decorado, es un método de sobrecarga de operadores, sobrecargando el operadorin
, use lo siguiente:@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
El método de extensión de esta estructura se proporciona especialmente para objetos
Java
(incluidos los de los paquetes android y androidX) , y no es necesario implementarlo usted mismo , porque el objeto declarado es uno , y generará un método de desestructuración para nosotros de forma predeterminada :Pair
Kotlin
Pair
Pair
data class
data class
Descompile en código Java para ver la
componentX()
serie de métodos generados. -
java
conversión hacia ykotlin
desdePair
-
toKotlinPair
Convertirandroidx包
elPair
objeto enKotlin
elPair
objeto. -
toAndroidXPair
Convertirkotlin
elPair
objeto enandroidx包
elPair
objeto. -
toKotlinPair
Convertirandroid包
elPair
objeto enKotlin
elPair
objeto. -
toAndroidPair
Convertirkotlin
elPair
objeto enandroid包
elPair
objeto.
Resumir
Para obtener el código fuente detallado, consulte el código fuente de archivos como , , , etc. core-ktx
en el paquete . A continuación, estoy listo para estudiar algunas herramientas de extensión para operaciones bajo el paquete (muchas, muchas categorías):SparseArray.kt
Pair.kt
SparseXXXArray.kt
core-ktx
graphics
View
Eche un vistazo a la comodidad que puede aportar a nuestro View
desarrollo común, ¡esté atento! !
Estoy participando en el reclutamiento del programa de firma de creadores de la Comunidad Tecnológica de Nuggets, haga clic en el enlace para registrarse y enviar .