美文网首页
kotlin 类的扩展函数

kotlin 类的扩展函数

作者: Bfmall | 来源:发表于2022-11-19 22:11 被阅读0次

    类的扩展函数学习笔记###

    
    /**
     * DESC   : 类的扩展函数
     *
     * 1.扩展函数不允许被重复定义
     * 2.对超类扩展函数的影响
     * 3.扩展函数 链式调用
     */
    const val KtBaseExtensionFunTest01_TAG = "KtBaseExtensionFunTest01"
    
    class ExtensionClass01(val name: String, val age: Int)
    
    /**
     * ExtensionClass01类的扩展函数showInfo
     * 背后代码实现是静态方法static showInfo
     */
    @SuppressLint("LongLogTag")
    fun ExtensionClass01.showInfo() {
        Log.d(KtBaseExtensionFunTest01_TAG, "showInfo==>name=$name" + ", age=$age")
    }
    
    //ExtensionClass01类的扩展函数getInfo
    fun ExtensionClass01.getInfo() = "getInfo==>name=$name" + ", age=$age"
    
    /**
     * 扩展函数背后代码
     *
        @SuppressLint({"LongLogTag"})
        public static final void showInfo(@NotNull ExtensionClass01 $this$showInfo) {
        Intrinsics.checkParameterIsNotNull($this$showInfo, "$this$showInfo");
        Log.d("KtBaseExtensionFunTest01", "showInfo==>name=" + $this$showInfo.getName() + ", age=" + $this$showInfo.getAge());
        }
    
        @NotNull
        public static final String getInfo(@NotNull ExtensionClass01 $this$getInfo) {
        Intrinsics.checkParameterIsNotNull($this$getInfo, "$this$getInfo");
        return "getInfo==>name=" + $this$getInfo.getName() + ", age=" + $this$getInfo.getAge();
        }
     */
    
    /**
     * String类的扩展函数addExtAction
     * this代表当前字符串
     * 如:"你好吗".addExtAction(3)
     * this == "你好吗"
     */
    fun String.addExtAction(number:Int) = this + "@".repeat(number)
    
    
    fun String.showStr() = println(this)
    
    //---------------------------------------------------------------
    
    data class ResponseResult01(val msg:String, val code:Int)
    
    @SuppressLint("LongLogTag")
    fun Any.showContent() {
        Log.d(KtBaseExtensionFunTest01_TAG, "showContent==>$this")
    }
    
    fun Any.showContent2() = "showContent2==>$this"
    
    
    //------------------------------------------------
    
    /**
     * 1.如果自己写了两个同名的扩展函数,编译不通过
     * 2.kt内置的扩展函数,被我们重复定义,属于覆盖,优先使用我们自定义的扩展函数
     */
    fun File.readLines(charset: Charset = Charsets.UTF_8) : List<String> {
        val result = ArrayList<String>()
        forEachLine(charset) {result.add(it)  }
        return result
    }
    
    //--------------------------------------------------
    /**
     * 以下为泛型扩展函数
     */
    //字符串长度
    @SuppressLint("LongLogTag")
    fun <T> T.showContentInfo() {
        Log.d(KtBaseExtensionFunTest01_TAG, "${if (this is String) "字符串长度${this.length}" else "不是字符串,你输入的内容是$this"}")
    }
    
    //显示调用时间
    @SuppressLint("LongLogTag")
    fun <I> I.showTime() {
        Log.d(KtBaseExtensionFunTest01_TAG, "调用时间是"+System.currentTimeMillis())
    }
    
    fun <INPUTTYPE> INPUTTYPE.showTypesAction() {
        when(this) {
            is String -> "是String类型"
            is Int -> "是Int整型"
            is Char -> "是Char字符类型"
            else -> "未知类型"
        }
    }
    
    
    /**
     * 模拟标准let函数
     * 解释如下:
     * 1.private 私有化
     * 2.inline,我们的函数是高阶函数,所以用到内联,做lambda的优化,提高性能
     * 3.fun <I,O> 声明两个函数泛型,I代表Input输入类型,O代表Output输出类型
     * 4. I.mLet对输入类型I进行函数扩展,扩展函数的名称是mLet,意味着所有的类型都可以使用xxx.mLet,万能类型
     * 5.lambdaAction:(I) -> O, (I输入)->输出O
     * 6.返回类型 : O,根据用户的返回类型变化而变化
     * 7. lambdaAction(this), 对输入类型I进行函数扩展,在整个函数扩展里面,this == I本身
     */
    private inline fun <I, O> I.mLet(lambdaAction: (I) -> O) : O = lambdaAction(this)
    
    fun commonFun() {}
    
    class KtBaseExtensionFunTest01 {
    
        @SuppressLint("LongLogTag")
        fun testExtensionFun01() {
            val extensionClass01 = ExtensionClass01("zhangsan", 11)
            extensionClass01.showInfo()
            Log.d(KtBaseExtensionFunTest01_TAG, "getInfo="+extensionClass01.getInfo())
    
            //你好吗@@@
            Log.d(KtBaseExtensionFunTest01_TAG, "你好吗".addExtAction(3))
            //are you ok ?@@@@@
            Log.d(KtBaseExtensionFunTest01_TAG, "are you ok ?".addExtAction(5))
        }
    
        fun testExtensionFun02() {
            //showContent==>ResponseResult01(msg=获取数据成功, code=200)
            ResponseResult01("获取数据成功", 200).showContent()
    
            "你好吗".showContent()
            val number1 = 888
            number1.showContent()
            val number2 = 888.8f
            number2.showContent()
            val number3 = 888.888
            number3.showContent()
            val char1 = 'A'
            char1.showContent()
    
            //链式调用
            "are you ok ?".showContent2().showContent2().showContent2()
    
    //        File("D:\\log.txt").readLines()
        }
    
        fun testExtensionFun03() {
            "你好吗".showContentInfo()
            88998.showContentInfo()
            //不是字符串,你输入的内容是kotlin.Unit
            commonFun().showContentInfo()
    
            "几点了?".showTime()
            commonFun().showContentInfo()
    
            "我是字符串哦".showTypesAction()
            999.9f.showTypesAction()
        }
    
    
        @SuppressLint("LongLogTag")
        fun testExtensionFun04() {
            //最后一行作为返回值
            val r1 = "你好吗".mLet {
                "我很好"
                true
                999.9f//最后一行作为返回值,返回值为O类型
            }
    
            val r2 = 99.mLet{
                "返回值O为$it"
            }
            //testExtensionFun04==>r1=999.9
            Log.d(KtBaseExtensionFunTest01_TAG, "testExtensionFun04==>r1="+r1)
            //testExtensionFun04==>r2=返回值O为99
            Log.d(KtBaseExtensionFunTest01_TAG, "testExtensionFun04==>r2="+r2)
        }
    
    }
    

    相关文章

      网友评论

          本文标题:kotlin 类的扩展函数

          本文链接:https://www.haomeiwen.com/subject/ploazrtx.html