什么是lambda表达式
以下是使用lambda表达式的例子
class Test(val name: String) {
private fun test1(t: ((p: String) -> Boolean)) {//1
val isSuccess = t.invoke("yang")
}
private fun test2() {
test1 {//2
println(it)
true
}
}
}
- 注释1:test1函数接收参数类型为((p: String) -> Boolean),这是函数类型;
- 注释2:调用test1函数,传入lambda表达式作为参数,其实lambda表达式也是高阶函数,只不过是匿名的;
反编译看看
public final class Test {
......
private final void test1(Function1 t) {//1
boolean isSuccess = (Boolean)t.invoke("yang");
}
private final void test2() {//2
this.test1(new Function1() {
@Override
public Object invoke(Object o) {
System.out.println(o);
return true;
}
});
}
......
}
public interface Function1<in P1, out R> : Function<R> {3
/** Invokes the function with the specified argument. */
public operator fun invoke(p1: P1): R
}
- 注释1:对应定义的test1函数,入参为Function1类型,Function1是接口,其invoke函数接收类型为P1的参数,返回值类型为R,其实Function1就是用来描述函数类型的((p: String) -> Boolean),Kotlin编译器会lambda转来成Function1;
- 注释2:调用test1函数,传入匿名内部类对象作为参数,内部类实现了Function1接口,是否感觉跟回调很类似;
- 注释3:前面介绍过了Function1是接口,其invoke函数接收类型为P1的参数,返回值类型为R,Kotlin提供了从Function0到Function22,分别接收0到22个参数;
总结
- lambda表达式是匿名高阶函数,可以被当成参数来使用;
- Kotlin编译器会lambda转来成Function1,延伸出来,高阶函数的原理也是一样;
以上分析有不对的地方,请指出,互相学习,谢谢哦!
网友评论