官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?
highlight: atelier-estuary-light theme: smartblue
本文是研究官方
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的語法糖,可以當成屬性
的形式調用(本質上還是調用的方法
):kotlin private fun test5() { val sparseArray: SparseArray<String> = SparseArray<String>() val size = sparseArray.size }
-
SparseArray<T>.contains(key: Int)
判斷包含指定key
可以看到這個方法使用了
operator
修飾,是一個運算符重載方法,重載了運算符in
,使用如下:kotlin @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>)
併合並兩個集合為一個新集合這也是一個運算符重載函數,重載了運算符
+
,項目中可以這樣使用:kotlin 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)
寫入數據重載了運算符
[]
的函數,可以這樣向集合中寫入數據:kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1[10] = "" }
-
SparseArray<T>.getOrDefault(key: Int, defaultValue: T)
帶默認值的讀值這個方法和
HashMap
的getOrDefault()
類似,當獲取的值為null時,就返回默認值:kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1.getOrDefault(10, "null") }
-
SparseArray<T>.getOrElse(key: Int, defaultValue: () -> T)
帶默認函數類型返回值的讀值這個和上面的
getOrDefault()
比較像,只不過提供默認值的不再是一個固定的具體類型的值,而是一個靈活的函數類型,我們可以在這個函數類型中進行額外的邏輯編寫:kotlin 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)
遍歷使用:
```kotlin
private fun test5() { val sparseArray1: SparseArray
= SparseArray () sparseArray1.forEach { key, value -> //執行操作 } } ``` -
SparseArray<T>.keyIterator()
遍歷鍵值key
這個方法會返回一個迭代器,這樣我們就可以使用
for in
來遍歷鍵值key
了:kotlin 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
修飾的運算符重載函數,關於這個解構
,我不太該怎麼去用語言來描述,大家直接看下使用吧:kotlin 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
開發帶來哪些便利,請您敬請期待吧!!
我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿。
- kotlin密封sealed class/interface的迭代之旅
- 2022年12月12日—2022年12月25日Android精品文章一覽
- Sqlite簡易性能優化方案,給你的應用插上“翅膀”
- 築基篇:設置界面的開發利器Preference Library,瞭解一下~
- Android消息機制完整的執行流程,瞭解一下
- 你可能需要了解下的Android開發技巧(二)
- 超有用的Android開發技巧:攔截界面View創建
- Handler創建的幾個必備知識點,瞭解一下
- Android消息機制中Message常用的幾種監控方式
- 數見不鮮的RecyclerView使用技巧,你瞭解嗎(一)?
- 常用到的幾個Kotlin開發技巧,減少對業務層代碼的入侵
- 超好用的官方core-ktx庫,瞭解一下(終)~
- Take a look,從delay()方法看協程的掛起與恢復
- 超好用的官方core-ktx庫,瞭解一下~
- 官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?
- 官方core-ktx庫能對富文本Span開發帶來哪些便利2
- 你需要了解的官方core-ktx庫能對開發帶來哪些便利1
- LeakCanary如何監聽Fragment、Fragment View、ViewModel銷燬時機?
- 非反射動態設置TabLayout指示器的寬度
- 探究EventBus粘性事件實現機制