Kotlin学习 04 kotlin的一些其它知识:库函数和扩展函数
kotlin 有很多函数和特性,可以方便的做一些关联操作,简化代码。例如以下一些:
一、let、also、run、with、apply 这5个标准库函数的区别
let 可以实现一个方法,将自身作为参数传递到方法中,it
run 可以实现一个方法,将自身作为参数传递到方法中,this
whit with是一个普通函数
also 可以实现一个方法,执行后直接返回当前对象
apply 传递的参数是this, 返回值也是this
1 2 3 4 5 6 7 8 9 10 | 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(),让其返回最后一个字符
1 2 3 | fun String.lastChar(): Char { return this .get( this .length - 1 ) }<br>IDE提示可以转换成fun String.lastChar(): Char {<br> return this [length - 1 ]<br>} // 补充判空情形。当前String可以为空(kotlin的特性)fun String?.lastChar(): Char? {<br> return this?.get(length - 1)<br>}<br>考虑边缘情况之后<br><br><br>>>> kotlin 调用<br>fun main() {<br> println("Kotlin".firstChar()) // 打印:K<br> println(null.firstChar()) // 打印:null<br>}<br><br>>>> Java 怎么调用?通过自动生成的 StringExtensionsKt System.out.println(StringExtensionsKt.lastChar("Java"));<br><br>>>> 别的类中可以调用吗?也可以调用,需要引入语法糖 <em id="__mceDel"><em id="__mceDel">sugars.lastChar </em></em>import sugars.lastCharprintln("".lastChar()) |
其实现的本质是什么?可以看转成后的Java代码是怎样的
1 | // 扩展函数独立生成了静态公有方法(转成Java后,kotlin class 中的多个扩展函数会在同一个Java类里面)public static final Character lastChar(@NotNull String $this$lastChar) {<br> Intrinsics.checkNotNullParameter($this$lastChar, "$this$lastChar");<br> CharSequence var1 = (CharSequence)$this$lastChar;<br> return var1.length() > 0 ? $this$lastChar.charAt($this$lastChar.length() - 1) : null;<br>} |
看下面一个例子,定义一个 EditText 的扩展函数,添加 TextWatcher,并且只需要 afterTextChanged 一个实现(这不就是我们经常要干的事情吗??)
1 2 3 4 5 6 7 8 9 10 11 12 | // 把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) {} }) }<br><br> |
关于扩展函数还有很多知识,自己还要慢慢学习……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术