七、Kotlin——扩展(Extensions)

Kotlin 能够扩展一个类的新功能而无需继承该类。 例如,你可以为一个你不能修改的来自第三方库中的类编写一个新的函数。 这个新增的函数就像那个原始类本来就有的函数一样,可以用普通的方法调用。 这种机制称为 扩展函数 。此外,也有 扩展属性, 允许你为一个已经存在的类添加新的属性。

在Kotlin中提供了大量的扩展,使得我们的代码更加简洁,开发出来的框架更加易用

一、扩展方法的使用

Kotlin的扩展函数可以让你作为一个类成员进行调用的函数。这样可以很方便的扩展一个已经存在的类,为它添加额外的方法。在Kotin源码中,有大量的扩展函数来扩展Java,这样使得Kotlin比Java更方便使用,效率更高。

  • 在Kotlin中使用
Kotlin 复制代码
class Jump{
    fun test(){
        println("jump test")
        // 在被扩展的类中使用
        doubleJump(1f)
    }
}
// 扩展方法的定义,就是在方法的前面加上类前缀
fun Jump.doubleJump(value: Float) : Boolean{
    println("value = $value")
    return  true
}

fun main() {
    // 使用对象调用
    val  ju = Jump()
    /// 外部调用 扩展
    ju.doubleJump(2f)
}
  • 在Java中使用
typescript 复制代码
public class JavaLession {
    public static void main(String[] args) {
        ///  在Java中调用 Kotlin 的扩展
        Lesson04Kt.doubleJump(new Jump(),1f)
    }
}

二、泛型扩展方法

为了考虑到扩展函数的通用性,我们可以借助上面课程中学习到的泛型,来为扩展方法进行泛型化改造以 fun MutableList Int.swap(index1:Int,index2:Int)为例,接下来我们为它进行泛型化改造

kotlin 复制代码
fun <T> MutableList<T>.jl_swap(index1: Int, index2: Int){
    var  tmp = this[index1]
    this[index1] = this[index2]
    this[index2] = tmp
}

fun main() {
    val test2 = mutableListOf("Android o","Android N", "Android M")
    test2.jl_swap(3,5)
}

三、为伴生对象添加扩展

如果一个类定义了伴生对象,那么我们也可以为伴生对象定义扩展函数与属性:

kotlin 复制代码
class  Jump{
    companion object{
    }
}
fun Jump.Companion.run(str: String){
    println(str)
}

fun main() {
    Jump.run("aa")
}

四、Kotlin中常用的扩展

在Kotlin的源码中定义了大量的扩展,比如: let,run ,apply ,了解并运用这些函数能帮我们提高编码效率。

- let扩展let扩展函数的实际上是一个作用域函数,当你需要去定义一个变量在一个特定的作用域范围内,那么let函数是一个不错的选择;let函数另一个作用就是可以避免写一些判断null的操作。

kotlin 复制代码
// let扩展函数,类后面加上?代表参数可能为空,使用的时候注意判空
fun testLet(str: String?){
    str.let {
        var str2 = "let 扩展"
        println(it + str2)
    }
    // str2 外部无法访问

    // 判空用法,当str为空,则不会触发闭包里面的逻辑
    str?.let {
        println(it.length)
    }

}

- run扩展 run函数只接收子个lambda函数为参数,以闭包形式返回,返回值为最后一行的值或者指定的return的表达式,在run函数中可以直接访问实例的公有属性和方法。

kotlin 复制代码
// 返回值为最后一行的值或者指定的return的表达式,在run函数中可以直接访问实例的公有属性和方法。
fun  testRun(jump: Jump): String{
    jump.run {
        test()
        println("ddd")
        return  "222"
    }
}

- apply扩展apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。 从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值,而apply函数的返回的是传入对象的本身。

apply一般用于一个对象实例初始化的时候,需要对对象中的属性进行赋值。或者动态inflate出一个XML的View的时候需要给View绑定数据也会用到,这种情景非常常见。

kotlin 复制代码
fun main() {
    // apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。
    // 从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样,run函数是以闭包形式返回最后一行代码的值,
    ArrayList<String>().apply {
        add("dd")
        add("333")
    }.run {
        for (s in this){
            println(s)
        }
    }

}
相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
ai2work1 天前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
ai2work1 天前
ch21 签名、校验与发版
kotlin
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui