七、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)
        }
    }

}
相关推荐
urkay-1 小时前
Android getDrawingCache 过时废弃
android·java·开发语言·kotlin·iphone·androidx
技术摆渡人1 小时前
Android 14系统深度分析
android·linux·驱动开发
帅得不敢出门2 小时前
Android8 Framework实现Ntp服务器多域名轮询同步时间
android·java·服务器·python·framework·github
走在路上的菜鸟2 小时前
Android学Dart学习笔记第十一节 错误处理
android·笔记·学习·flutter
葡萄城技术团队2 小时前
Excel 文件到底是怎么坏掉的?深入 OOXML 底层原理讲解修复策略
android·java·excel
QuantumLeap丶2 小时前
《Flutter全栈开发实战指南:从零到高级》- 22 -插件开发与原生交互
android·flutter·ios
2501_915921433 小时前
混合开发应用安全方案,在多技术栈融合下构建可持续、可回滚的保护体系
android·安全·ios·小程序·uni-app·iphone·webview
AllBlue3 小时前
unity嵌入安卓界面,如何显示状态
android·unity·游戏引擎
QuantumLeap丶3 小时前
《Flutter全栈开发实战指南:从零到高级》- 21 -响应式设计与适配
android·javascript·flutter·ios·前端框架