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) {} }) }
关于扩展函数还有很多知识,自己还要慢慢学习……