八、kotlin扩展函数

视频课 视频老师的博客

  • 提供架构的易用性
  • 减少代码量,让代码更加整洁、纯粹
  • 提高编码的效率,生产力提高

1.扩展方法

扩展方法的原型

fun String.lastChar(): Char = this.get(this.length-1)

2.扩展方法的使用

2.1在Kotlin中使用

fun main() {
    Jump().test()
    Jump().doubleJump()
}

class Jump{
    fun test(){}
}
//扩展函数的定义,就是在方法的前面加上类前缀
//针对无法直接修改类的时候,如想要修改一个jar包种的类
fun Jump.doubleJump():String{
    return "Jump.doubleJump()"
}

2.2 在Java中使用

public class KtExtensions {
    public static void main(String[] args) {
        KTExtensionsKt.doubleJump(new Jump());
    }
}S

3.原理解析:Kotlin扩展函数是怎么实现的

AS中Tools —> kotlin ----> show kotlin byteCode

public final class KTExtensionsKt {
   public static final void main() {
      (new Jump()).test();
      doubleJump(new Jump());
   }

   // $FF: synthetic method
   public static void main(String[] var0) {
      main();
   }

   @NotNull
   public static final String doubleJump(@NotNull Jump $this$doubleJump) {
      Intrinsics.checkNotNullParameter($this$doubleJump, "$this$doubleJump");
      return "Jump.doubleJump()";
   }
}

通过反编译出的java代码

当在java中调用kotlin扩展方法时需要传入一个所扩展类的实例对象

4.泛型扩展方法

fun <T> MutableList<T>.swap(index1:Int , index2: Int){
    val temp = this[index1]
    this[index1] = this[index2]
    this[index2] = temp
}

主函数调用

val list = mutableListOf<Int>(1,2,3,4)
list.swap(3,1)
for(number in list){
    print("$number ")
}

5.扩展属性

扩展属性提供了一种方法能通过属性语法进行访问的API来扩展。

尽管它们被叫做属性,但是它们不能拥有任何状态,它不能添加额外的字段到现有的Java对象实例

//5.扩展属性
//对String类添加一个lastChar属性 (在kotlin里任何字段都有get set方法)
val String.lastChar:Char get() = this.get(this.length - 1)

主函数调用

//5.扩展属性
val str = "evening"
val strLastChar = str.lastChar
println("\nlastChar: $strLastChar")

6.为伴生对象添加扩展

class Eat {
    companion object {}
}
fun Eat.Companion.print(str: String) {
    println("Eat.Companion"+str)
}

主函数调用

Eat.print("为伴生对象添加扩展")

7.Kotlin中常用的扩展

7.1 let扩展

let扩展函数的实际上是一个作用域函数,

  • 当你需要去定义一个变量在一个特定的作用域范围内,那么let函数是一个不错的选择;
  • let函数另一个作用就是可以避免写一些判断null的操作。
//7.1  let扩展 类名后面加上? 代表参数可能为空,使用的时候 注意判空
fun testLet(str: String?){
/*    str.let {//it:String?
        val str2 = "morning"
        println(str2 + it)
    }*/

    //判空用法,当str为空时不会触发闭包里面的逻辑
    str?.let{
        val str2 = "morning"
        println("$str2  $it")
    }
}

主函数调用

//7.1  let扩展
testLet("ddd")

7.2 run扩展

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

//7.2 run扩展
//在run函数中可以**直接访问实例的公有属性和方法**
fun testRun(jump: Jump) : String{
    jump.run {
        test() //jump.test()
        return "run函数"
    }
}

主函数调用

//7.2 run扩展
val j = Jump()
println(testRun(j))

7.3 apply扩展

apply函数的作用是:调用某对象的apply函数,在函数范围内,可以任意调用该对象的任意方法,并返回该对象。

从结构上来看apply函数和run函数很像,唯一不同点就是它们各自返回的值不一样 run函数是以闭包形式返回最后一行代码的值,而apply函数的返回的是传入对象的本身

//7.3 apply扩展
fun testApply() {
    arrayListOf<String>().apply {
        add("111")
        add("22222")
    }.let {
        println(it)
    }
}

主函数调用

//7.3 apply扩展
testApply()

案例:使用Kotlin扩展为控件绑定监听器减少模板代码

class MainActivity : AppCompatActivity() {
		。
		。
		。
		。

        //绑定点击事件
        R.id.nav_view.onClick(this){ //click函数
            println("nav_view onClick")
        }
    }
}

//扩展函数 能够直接根据一个id为view绑定一个监听事件
fun Int.onClick(activity: Activity , click:()->Unit){
    activity.findViewById<View>(this).setOnClickListener{
        println("onClick")
        click()
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值