最近在学郭神的《第三行代码》,大部分内容出自于此,另外加上我自己的一些总结和体会,记此学习笔记,若有歧义,欢迎指出,一起学习进步!
本篇内容主要介绍了Lambda表达式的用法和Kotlin中常用的简化规则,提升代码阅读能力,理解之后就能明白,为什么kotlin大神的代码可以如此优雅
定义
直白的说,Lambda就是一小段可以作为参数传递的代码。
一般向某个函数传参都只能是变量,而Lambda可以传一段代码。
类似python中的map、reduce函数,允许传入Lambda表达式,ketlin的集合中也有很多类似的函数式API ,如map() filter() maxByOrNull()等( 书中的maxBy() 已被弃用)
虽然kotlin对传入的代码长度没有限制,但是太长可能会影响代码的可读性。
基本用法
如下,在集合中找到长度最长的单词
val list = listOf("Hello", "world", "I", "am", "kotlin")
val lambda = { word: String -> word.length }
val maxLengthWord = list.maxByOrNull(lambda) //maxByOrNull传入一小段代码
println("max length word is $maxLengthWord")
简化用法
我们可以将上面的代码简化处理,就得到如下:
val list = listOf("Hello", "world", "I", "am", "kotlin")
val maxLengthWord = list.maxByOrNull { it.length } // maxByOrNull传入的就是一个简化的Lambda表达式
println("max length word is $maxLengthWord")
是不是省了很多代码,也优雅很多
简化规则
下面我们逐步进行简化,来方便理解kotlin的作为函数式语言的精髓
规则一
可以不需要专门定义lambda,可以将其直接传入,如下:
val maxLengthWord = list.maxByOrNull({ word: String -> word.length })
规则二
kotlin中,当Lambda参数是函数的最后一个参数时,可以将Lambda表达式移到函数括号( )的后面,如下:
val maxLengthWord = list.maxByOrNull() { word: String -> word.length }
规则三
kotlin中,如果Lambda参数是函数的唯一参数的话,可以将函数括号( )省略,如下:
val maxLengthWord = list.maxByOrNull { word: String -> word.length }
规则四
kotlin拥有出色的类型推导机制,因此可以省略参数类型声明,如下:
val maxLengthWord = list.maxByOrNull { word -> word.length }
规则五
当Lambda表达式的参数列表中只有一个参数时,可以省略声明参数名,直接用 it 关键字代替,就得到了上面的最终简化版本,如下:
val maxLengthWord = list.maxByOrNull { it.length }
举一反三
上述的简化规则在使用Kotlin时可以灵活运用
例如Android中最常用的设置点击监听,本来完整代码应该如下:
widgetBtnF2nmczuc.setOnClickListener(object : View.OnClickListener {
override fun onClick(p0: View?) {
Log.d(TAG, p0.toString())
}
})
上述代码可以使用Lambda表达式来简化
规则六
kotlin中,需要实现某个抽象类的时候,若该抽象类只有一个抽象方法需要重写,则可以用Lambda直接传入该方法的实现代码,java 1.8以后也支持如此,如下:
widgetBtnF2nmczuc.setOnClickListener({ p0 -> Log.d(TAG, p0.toString()) })
看到这里,是不是同上面 规则一 的时候一样了,再进行二、三、四、五的简化,就得到了如下代码:
widgetBtnF2nmczuc.setOnClickListener { Log.d(TAG, it.toString()) }
总结
kotlin的Lambda表达式和标准函数搭配起来灵活运用,可以帮助我们减少很多不必要的代码,编程变得如此优雅。
需要注意的是,以上规则的运用条件要清楚,不满足条件的时候可不能简化噢。例如 规则六 中,抽象类的抽象方法只有一个时,才能简化成Lambda表达式, 规则五 中,Lambda参数只有一个时才能省略并用 it 关键字来代替他的参数。