Kotlin学习 04 kotlin的一些其它知识:库函数和扩展函数

kotlin 有很多函数和特性,可以方便的做一些关联操作,简化代码。例如以下一些:

一、let、also、run、with、apply 这5个标准库函数的区别

let 可以实现一个方法,将自身作为参数传递到方法中,it
run 可以实现一个方法,将自身作为参数传递到方法中,this
whit with是一个普通函数
also 可以实现一个方法,执行后直接返回当前对象
apply 传递的参数是this, 返回值也是this
val textView = TextView(context)
textView.apply {
    setOnClickListener() {
        // do something
    }
    gravity = Gravity.END
    text = mCompleteText
    setTextColor(mCompleteTextColor)
    setTextSize(TypedValue.COMPLEX_UNIT_SP, mCompleteTextSize)
} 
 
因为 apply 中默认传入this,因此可以直接给一些属性赋值 gravity、text,当然也可以通过set的方法  setTextColor();
可见,使用kotlin熟练之后,真的可以少写很多代码
 
二、扩展函数

给String定义一个扩展函数 lastChar(),让其返回最后一个字符

fun String.lastChar(): Char {
    return this.get(this.length - 1)
}
IDE提示可以转换成
fun String.lastChar(): Char {
return this[length - 1]
}
// 补充判空情形。当前String可以为空(kotlin的特性)
fun String?.lastChar(): Char? {
return this?.get(length - 1)
}
考虑边缘情况之后


>>> kotlin 调用
fun main() {
    println("Kotlin".firstChar()) // 打印:K
    println(null.firstChar()) // 打印:null
}

>>> Java 怎么调用?通过自动生成的 StringExtensionsKt   
System.out.println(StringExtensionsKt.lastChar("Java"));

>>> 别的类中可以调用吗?也可以调用,需要引入语法糖 sugars.lastChar
import sugars.lastChar
println("".lastChar())

其实现的本质是什么?可以看转成后的Java代码是怎样的

// 扩展函数独立生成了静态公有方法(转成Java后,kotlin class 中的多个扩展函数会在同一个Java类里面)
public static final Character lastChar(@NotNull String $this$lastChar) {
Intrinsics.checkNotNullParameter($this$lastChar, "$this$lastChar");
CharSequence var1 = (CharSequence)$this$lastChar;
return var1.length() > 0 ? $this$lastChar.charAt($this$lastChar.length() - 1) : null;
}

  

看下面一个例子,定义一个 EditText 的扩展函数,添加 TextWatcher,并且只需要 afterTextChanged 一个实现(这不就是我们经常要干的事情吗??)

// 把TextWatcher的三个方法变成一个了 
fun EditText.afterTextChanged(afterTextChanged: (String) -> Unit) {
    this.addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            afterTextChanged.invoke(editable.toString())
        }

        override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

        override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
    })
}

  

关于扩展函数还有很多知识,自己还要慢慢学习……

 
 
 
 
 
 
 
 
 
 
posted @ 2023-06-01 08:51  Liu Siyuan  阅读(23)  评论(0)    收藏  举报