官方core-ktx庫能對SparseArray系列、Pair開發帶來哪些便利?

語言: CN / TW / HK

highlight: atelier-estuary-light theme: smartblue


本文是研究官方core-ktx庫的第三篇文章,旨在探究該庫中有哪些工具類或方法能夠提高我們的開發效率。

前兩篇文章的參考連結如下:

你需要了解的官方core-ktx庫能對開發帶來哪些便利1

官方core-ktx庫能對富文字Span開發帶來哪些便利?

本篇文章主要是研究core-ktx庫對SparseArray系列和Pair開發能程式碼哪些便利!!

SparseArray系列

SparseArrayLongSparseArray系列就是一種支援key-value資料結構形式讀寫的封裝類,相比較於HashMap的有點有兩個:

image.png

  1. 鍵值key是一個基本資料型別,而不是一個基本資料型別對應的封裝類,不需要裝箱
  2. 它的資料結構是鍵值key一個數組,value值一個數組,不像HashMap,基於Entrykey-value進行封裝再進行讀寫

PS:Android中還存在另一系列集合SparseIntArraySparseBooleanArraySparseLongArray,這些集合更厲害,key和value都是基本資料型別,不需要裝箱,不要和上面的集合搞混了。不過這兩種集合core-ktx提供的擴充套件封裝都幾乎相同,就不單獨進行一一闡述了。

  1. SparseArray<T>.size()獲取集合大小

    image.png

    這個沒什麼新奇,就是對SparseArray原來獲取大小的方式size()進行了一層封裝,藉助於kotlin的語法糖,可以當成屬性的形式呼叫(本質上還是呼叫的方法):

    kotlin private fun test5() { val sparseArray: SparseArray<String> = SparseArray<String>() val size = sparseArray.size }

  2. SparseArray<T>.contains(key: Int)判斷包含指定key

    image.png

    可以看到這個方法使用了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到專案工具類庫中使用即可。

  3. SparseArray<T>.plus(other: SparseArray<T>)併合並兩個集合為一個新集合

    image.png

    這也是一個運算子過載函式,過載了運算子+,專案中可以這樣使用:

    kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() val sparseArray2: SparseArray<String> = SparseArray<String>() val newArray = sparseArray1 + sparseArray2 }

  4. SparseArray<T>.containsValue(value: T)判斷是否存在指定value

    image.png

    這個和上面的contains方法類似,不過這個是判斷某個value值是否在該集合中,同樣也是過載了運算子in

  5. SparseArray<T>.set(key: Int, value: T)寫入資料

    image.png

    過載了運算子[]的函式,可以這樣向集合中寫入資料:

    kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1[10] = "" }

  6. SparseArray<T>.getOrDefault(key: Int, defaultValue: T)帶預設值的讀值

    image.png

    這個方法和HashMapgetOrDefault()類似,當獲取的值為null時,就返回預設值:

    kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1.getOrDefault(10, "null") }

  7. SparseArray<T>.getOrElse(key: Int, defaultValue: () -> T)帶預設函式型別返回值的讀值

    image.png

    這個和上面的getOrDefault()比較像,只不過提供預設值的不再是一個固定的具體型別的值,而是一個靈活的函式型別,我們可以在這個函式型別中進行額外的邏輯編寫:

    kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() sparseArray1.getOrElse(10) { val tmp = "哈哈哈${sparseArray1.size}" tmp } }

  8. SparseArray<T>.isEmpty()判斷集合是否為空的

    image.png

  9. SparseArray<T>.remove(key: Int, value: T)移除指定key-value

    image.png

  10. SparseArray<T>.forEach(action: (key: Int, value: T) -> Unit)遍歷

    image.png

    使用:

    ```kotlin

    private fun test5() { val sparseArray1: SparseArray = SparseArray() sparseArray1.forEach { key, value -> //執行操作 } } ```

  11. SparseArray<T>.keyIterator()遍歷鍵值key

    image.png

    這個方法會返回一個迭代器,這樣我們就可以使用for in來遍歷鍵值key了:

    kotlin private fun test5() { val sparseArray1: SparseArray<String> = SparseArray<String>() for (key in sparseArray1.keyIterator()) { //執行操作 } } 自定義迭代器就可以幫助我們實現通過for in關鍵字遍歷,具體的可以參考我之前寫的一篇文章:你需要懂的Kotlin開發技巧之八#運算子過載for in

  12. SparseArray<T>.valueIterator()遍歷value

    image.png

    使用起來和上面的keyIterator()方法類似。

Pair<F, S>系列

  1. componentX()解構

    image.png

    這也是一個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會預設給我們生成解構的方法:

    image.png

    反編譯成java程式碼就可以看到生成的componentX()系列方法。

  2. javakotlinPair相互轉換

  3. toKotlinPairandroidx包Pair物件轉成KotlinPair物件

    image.png

  4. toAndroidXPairkotlinPair物件轉成androidx包Pair物件

    image.png

  5. toKotlinPairandroid包Pair物件轉成KotlinPair物件

    image.png

  6. toAndroidPairkotlinPair物件轉成android包Pair物件

    image.png

總結

詳細的原始碼請自行參考core-ktx包下的SparseArray.ktPair.ktSparseXXXArray.kt等檔案原始碼。接下來就準備研究下core-ktxgraphics包下的關於View操作的一些擴充套件工具了(好多好多類):

image.png
看下能為我們常見的View開發帶來哪些便利,請您敬請期待吧!!

我正在參與掘金技術社群創作者簽約計劃招募活動,點選連結報名投稿