kotlin笔记代码13-扩展函数

package com.kotl
// import com.kotl.ut.random
import com.kotl.ut.random as randomizer  // 使用as 别名

/**
 *  1.扩展函数
 *    01. 不修改原类的情况下,扩展类的功能
 *    02. 语法示例: fun Any.d(str: String){} 与普通函数定义的差别是:函数名前增加了: className.
 *    03.infix 关键字:适用于单个参数的扩展和类函数,使用该关键字修饰的函数,调用时可以省略.和参数括号
 *    04. 如果扩展函数定义在不同包,需要使用import导入
 *    04. import xxx as 别名的使用. 示例: import com.kotl.ut.random as randomizer
 *  2. 泛型扩展函数
 *    01. 示例: fun <T> T.fd(str: String) {}
 *  3. 属性扩展
 *    01: 局限性: Extension property cannot be initialized because it has no backing field
 *    02. 扩展属性中没有field, 不能像正常属性那样赋值
 *  4. 可空类扩展
 *    01:
 *
 */

// 1-1. 扩展String函数 示例
fun String.toMyStr(value: String): String {
    return "$value!!"
}

// 1-2. 扩展Any函数 示例
fun Any.d(str: String) {
    Log.d(str)
}

// 2-1. 扩展泛型函数 示例: 给泛型T的所有对象添加函数fd
fun <T> T.fd(str: String) {
    Log.d(str)
}


// 3-1. 属性扩展: Extension property cannot be initialized because it has no backing field
var String.strLen: Int
    get() = let { // 借用let 获取调用的字符串
        Log.d("let it:$it")
        return it.length
    }
    set(value) {
        //  field = value // 如何正常赋值 ???
    }

//4. 可空类扩展
infix fun String?.def(default: String) = println(this ?: default)


class A14 {
    fun <T> getA(t: T) {
        t.fd("调用泛型扩展函数")
        t.let { }
    }
}

fun main() {
    // 使用扩展String的函数
    Log.d("toMyInt:" + "".toMyStr("66"))
    // 使用扩展 Any 的函数
    "".d("=======我是扩展Any的函数====1==")
    // 这种语法太灵活... 相比java ,如果不加限制,容易失控...
    1.d("========我是扩展Any的函数===2==")
    A14().getA("")
    Log.d("我是扩展的属性: " + "11234".strLen)
    var str: String? = null
    str def "bac" //infix修饰的函数def调用示例
    Log.d("可空类扩展验证: " + str?.length)
    val ls: List<Int> = listOf(1, 3, 4, 5, 7)
    // 调用其他类中的扩展函数,如果定义在不同包,需要使用import导入
    Log.d("调用定义在其它文件中的扩展函数示例:" + ls.randomizer())
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值