公式のcore-ktxライブラリがSparseArrayシリーズとPairの開発にどのような利便性をもたらすことができますか?

この記事はcore-ktx库的第三篇文章、ライブラリ内のどのツールクラスまたはメソッドが開発効率を向上させることができるかを調査することを目的とした研究担当者です。

最初の2つの記事の参照リンクは次のとおりです。

公式のcore-ktxライブラリは、知っておく必要のある開発にどのような便利さをもたらすことができますか?

公式のcore-ktxライブラリは、リッチテキストスパンの開発にどのような利便性をもたらすことができますか?

この記事は主に、シリーズおよび開発コードcore-ktxのライブラリの利便性を研究することを目的としています。SparseArrayPair

SparseArrayシリーズ

SparseArray、 seriesは、データ構造の形式での読み取りと書き込みをサポートLongSparseArrayする一種のカプセル化クラスです。これと比較すると、次の2つの点があります。key-valueHashMap

image.png

  1. キー値keyは基本データ型であり、基本データ型に対応するラッパークラスではありません。必要ありません。装箱
  2. そのデータ構造は、カプセル化に基づいて、読み取りと書き込みを行うのとは異なり、キーの配列と値key配列ですvalueHashMapEntrykey-value

PS:AndroidSparseIntArrayには別の一連のコレクションがありますSparseBooleanArray、、、SparseLongArrayこれらのコレクションはより強力key和value都是基本数据类型です、、ボクシングは必要ありません、上記のコレクションと混同しないでください。ただし、これら2つのコレクションによって提供される拡張パッケージcore-ktxはほとんど同じであるため、個別に説明することはしません。

  1. SparseArray<T>.size()コレクションサイズを取得する

    image.png

    これは新しいことでSparseArrayはなく、サイズを取得する元の方法をカプセル化したものsize()です。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します。次を使用します。

    @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

    这也是一个运算符重载函数,重载了运算符+,项目中可以这样使用:

    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

    重载了运算符[]的函数,可以这样向集合中写入数据:

    private fun test5() {
        val sparseArray1: SparseArray<String> = SparseArray<String>()
        sparseArray1[10] = ""
    }
    复制代码
  6. SparseArray<T>.getOrDefault(key: Int, defaultValue: T)带默认值的读值

    image.png

    这个方法和HashMapgetOrDefault()类似,当获取的值为null时,就返回默认值:

    private fun test5() {
        val sparseArray1: SparseArray<String> = SparseArray<String>()
        sparseArray1.getOrDefault(10, "null")
    }
    复制代码
  7. SparseArray<T>.getOrElse(key: Int, defaultValue: () -> T)带默认函数类型返回值的读值

    image.png

    这个和上面的getOrDefault()比较像,只不过提供默认值的不再是一个固定的具体类型的值,而是一个灵活的函数类型,我们可以在这个函数类型中进行额外的逻辑编写:

    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

    使用:

    
    private fun test5() {
        val sparseArray1: SparseArray<String> = SparseArray<String>()
        sparseArray1.forEach { key, value ->
            //执行操作
        }
    }
    复制代码
  11. SparseArray<T>.keyIterator()遍历键值key

    image.png

    这个方法会返回一个迭代器,这样我们就可以使用for in来遍历键值key了:

    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修饰的运算符重载函数,关于这个解构,我不太该怎么去用语言来描述,大家直接看下使用吧:

    private fun test6() {
        val pair = Pair(10, "ha")
        val (key, value) = pair
    }
    复制代码

    就是可以直接将这个对象的内部属性赋值给局部声明的变量,如果你只使用key或value,可以将不想要解构的属性使用_代替: val (key , _) = pair //只使用key

    この構造の拡張メソッドは、オブジェクトJava(androidおよびandroidXパッケージに含まれるものを含む)用に特別に提供されており、宣言されたオブジェクトは1つであるため、自分で実装する必要はありません。デフォルトで破壊メソッドが生成されます。 :PairKotlinPairPairdata classdata class

    image.png

    Javaコードに逆コンパイルして、生成されたcomponentX()一連のメソッドを確認します。

  2. javakotlinの間のPair変換

  • toKotlinPairオブジェクトをオブジェクト変換androidx包ますPairKotlinPair

    image.png

  • toAndroidXPairオブジェクトをオブジェクト変換kotlinますPairandroidx包Pair

    image.png

  • toKotlinPairオブジェクトをオブジェクト変換android包ますPairKotlinPair

    image.png

  • toAndroidPairオブジェクトをオブジェクト変換kotlinますPairandroid包Pair

    image.png

要約する

詳細なソースコードについてはcore-ktx、パッケージ内SparseArray.ktPair.kt、、、SparseXXXArray.ktなどのファイルのソースコードを参照してください。core-ktx次に、graphicsパッケージView(多くの、多くのカテゴリ)の下で操作するためのいくつかの拡張ツールを研究する準備ができています:

image.png
それが私たちの共通のView開発にどのような便利さをもたらすことができるかを見てください、お楽しみに!

ナゲッツテクノロジーコミュニティのクリエイター署名プログラムの募集に参加しています。リンクをクリックして登録し、送信してください。

おすすめ

転載: juejin.im/post/7118765812105609230