kotlin 动态参数 vararg

2022-11-20  本文已影响0人  Bfmall
/**
 * DESC   : 动态参数 vararg
 */
const val KtBaseVarargTest01_TAG = "KtBaseVarargTest01"

class MultiArgClass<T>(val flag : Boolean, vararg objects : T) {

    //out 表示T只能被读取,不能修改
    private val objectArr : Array<out T> = objects

    fun showObj(index: Int) : T? = objectArr[index].takeIf { flag } ?: null

    fun <O> map(index: Int, mapAction: (T ?) -> O) = mapAction(objectArr[index].takeIf { flag })
}

class KtBaseVarargTest01 {

    fun testVararg01() {
        /**
         * 由于使用太多的混合类型了,泛型真正的类型是MultiArgClass<{Comparable<*> & java.io.Serializable}>
         * 因为不允许这样写MultiArgClass<{Comparable<*> & java.io.Serializable}>,所以使用MultiArgClass<Any?>代替
         */
        val multiArgClass /*: MultiArgClass<Any?> */= MultiArgClass(true, "你好吗", 99, 99.8, 99.99, 'A', false)

        val r1 = multiArgClass.showObj(0)
        val r2 = multiArgClass.showObj(1)
        val r3 = multiArgClass.showObj(3)
        val r4 = multiArgClass.showObj(4)
        /**
         * testVararg01==>r1=你好吗
         * testVararg01==>r2=99
         * testVararg01==>r3=99.99
         * testVararg01==>r4=A
         */
        Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r1="+r1)
        Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r2="+r2)
        Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r3="+r3)
        Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r4="+r4)

        /**
         * it的类型是{Comparable<*> & java.io.Serializable},需要转换一下才行
         */
        val r5 = multiArgClass.map(1) {
            //lambda表达式最后一行位返回值
            "值为="+it
        }
        //testVararg01==>r5=值为=99
        Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r5="+r5)

        val r6 : String = multiArgClass.map(2) {
            //it == objectArr[index]
            //lambda表达式最后一行位返回值
            "长度为="+it.toString().length
        }
        Log.d(KtBaseVarargTest01_TAG, "testVararg01==>r6="+r6)
    }

}
上一篇 下一篇

猜你喜欢

热点阅读