官方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開發帶來哪些便利,請您敬請期待吧!!

我正在參與掘金技術社區創作者簽約計劃招募活動,點擊鏈接報名投稿