什么是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函數(shù)接收參數(shù)類型為((p: String) -> Boolean)午绳,這是函數(shù)類型沮尿;
- 注釋2:調(diào)用test1函數(shù),傳入lambda表達式作為參數(shù),其實lambda表達式也是高階函數(shù),只不過是匿名的;
反編譯看看
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:對應(yīng)定義的test1函數(shù)鸭蛙,入?yún)镕unction1類型,F(xiàn)unction1是接口筋岛,其invoke函數(shù)接收類型為P1的參數(shù)娶视,返回值類型為R,其實Function1就是用來描述函數(shù)類型的((p: String) -> Boolean)睁宰,Kotlin編譯器會lambda轉(zhuǎn)來成Function1肪获;
- 注釋2:調(diào)用test1函數(shù),傳入匿名內(nèi)部類對象作為參數(shù)柒傻,內(nèi)部類實現(xiàn)了Function1接口孝赫,是否感覺跟回調(diào)很類似;
- 注釋3:前面介紹過了Function1是接口红符,其invoke函數(shù)接收類型為P1的參數(shù)青柄,返回值類型為R,Kotlin提供了從Function0到Function22预侯,分別接收0到22個參數(shù)致开;
總結(jié)
- lambda表達式是匿名高階函數(shù),可以被當(dāng)成參數(shù)來使用萎馅;
- Kotlin編譯器會lambda轉(zhuǎn)來成Function1双戳,延伸出來,高階函數(shù)的原理也是一樣校坑;
以上分析有不對的地方拣技,請指出,互相學(xué)習(xí)耍目,謝謝哦!