1、什么是Lambda
Lambda 表达式,其实就是匿名函数。而函数其实就是功能(function),匿名函数,就是匿名的功能代码了。在 Kotlin 当中,函数也是作为类型的一种出现的,它也是可以被赋值和传递的,这主要就体现在 Lambda 表达式上。
先来看一个 Lambda 表达式的例子:
fun main(args: Array<String>) {
val lambda = {
left: Int, right: Int
->
left + right
}
println(lambda(2, 3))
}
定义了一个变量 lambda,赋值为一个 Lambda 表达式。Lambda 表达式用一对大括号括起来,后面先依次写下参数及其类型,如果没有就不写,接着写下 -> ,这表明后面的是函数体了,函数体的最后一句的表达式结果就是 Lambda 表达式的返回值,比如这里的返回值就是参数求和的结果。
后面我们用 () 的形式调用这个 Lambda 表达式,其实这个 () 对应的是 invoke 方法,换句话说,我们在这里也可以这么写:
println(lambda.invoke(2,3))
这两种调用的写法是完全等价的。毫无疑问,这段代码的输出应该是 5。
2、Lambda表达式简化
先来看一下简化流程:
总结:
- 最后一个Lambda可以移出去
- 只有一个Lambda,小括号可省略
- Lambda 只有一个参数可默认为 it
- 入参、返回值与形参一致的函数可以用函数引用的方式作为实参传入
3、Lambda返回
Lambda 表达式,实质上就是个表达式,虽然看上去像函数,功能上也像函数,可它看起来也不过是个代码块罢了。return 会直接结束 Lambda表达式所在的函数,要想只是退出Lambda表达式,定义一个标签就可以了。你还可以在 return@forEachBlock 后面加上你的返回值。
例如:
fun main(args: Array<String>) {
args.forEach forEachBlock@{
if(it == "q") return@forEachBlock
println(it)
}
println("The End")
}
4、SAM转换
转换条件:
- 调用者在 Kotlin 当中,被调用者是 Java 代码。
- 参数必须是 Java 接口,也就是说,Kotlin 接口和抽象类、Java 抽象类都不可以。
- 参数的 Java 接口必须只有一个方法。
举一个android常见的例子:
view.setOnClickListener{
view ->
...
}
view.setOnClickListener(...) 是 Java 方法,参数 OnClickListener 是 Java 接口,并且只有一个方法:
public interface OnClickListener {
void onClick(View v);
}