Lambda表达式及应用
目錄
- Lambda表達(dá)式
- 概念
- 應(yīng)用
- 在forEach()方法使用
- 用來(lái)替代匿名內(nèi)部類
- 代碼驗(yàn)證(Lambda表達(dá)式替代匿名內(nèi)部類)
Lambda表達(dá)式
概念
語(yǔ)法形式: () -> {}
組成:
參數(shù)列表相關(guān)概念:
參數(shù)個(gè)數(shù):
無(wú)參數(shù),或者,1個(gè)或多個(gè);
另外,只有一個(gè)參數(shù)時(shí)括號(hào)可以省略。
參數(shù)的類型:
一般不定義參數(shù)類型,由編譯器推理得到,或者特殊情況下,可以自己指定這些參數(shù)的類型。
方法體:
方法體中可以放參數(shù)相關(guān)的多句執(zhí)行語(yǔ)句,也可以有return語(yǔ)句,當(dāng)代碼語(yǔ)句只有一句時(shí),花括號(hào)可以省略。不在方法體中定義新的方法。有待考證*1
應(yīng)用
在forEach()方法使用
Arrays.asList(1, 2, 3, 4, 5).forEach(x -> System.out.println(x));用來(lái)替代匿名內(nèi)部類
1、繼承式匿名內(nèi)部類如下:
new “類名”(){}Lambda表達(dá)式代替:無(wú)法替代。有待考證*2
匿名內(nèi)部類的花括號(hào)內(nèi)是空的,對(duì)應(yīng)Lambda表達(dá)式花括號(hào)內(nèi)也是空的,但會(huì)【報(bào)錯(cuò)】Not a statement。說(shuō)明不能是空的,得有執(zhí)行語(yǔ)句。
2、接口式匿名內(nèi)部類如下:
new “接口名”(){//重寫這個(gè)父類“接口名”的一些或全部方法public 返回類型 方法名(參數(shù)類型 參數(shù)){//代碼執(zhí)行語(yǔ)句} }Lambda表達(dá)式代替:
【報(bào)錯(cuò)】:Multiple non-overriding abstract methods found in interface test.CarFun。
有待考證*3:是不是我不知道接口多個(gè)方法時(shí),Lambda表達(dá)式的替換接口式匿名內(nèi)部類的方法。
代碼驗(yàn)證(Lambda表達(dá)式替代匿名內(nèi)部類)
代碼示例:
接口CarFun.java:
main函數(shù)驗(yàn)證:Test.java
下圖在main函數(shù)下寫了接口式匿名內(nèi)部類。并用zerocarfun調(diào)用了drive()和stop()方法。接下來(lái)要寫一個(gè)Lambda表達(dá)式替換它。
對(duì)應(yīng)上圖,替換成Lambda表達(dá)式后,執(zhí)行代碼結(jié)果:
說(shuō)明替換成功了。
先打開CarFun中第5行代碼注釋。
CarFun接口添加stop()方法后。【報(bào)錯(cuò)】:在CarFun接口中找到多個(gè)非重寫的抽象方法。
在Lambda表達(dá)式里添加stop()方法的執(zhí)行語(yǔ)句:
System.out.println("zero停車了");
仍然【報(bào)錯(cuò)】:在CarFun接口中找到多個(gè)非重寫的抽象方法。
不知道如何用Lambda表達(dá)式替代,有多個(gè)方法的接口式匿名內(nèi)部類。
考證*3:
百度一下報(bào)錯(cuò)信息。
知道:@FunctionalInterface會(huì)告訴編譯器可以用Lambda表達(dá)式。
我很好奇這個(gè)是什么注解?我在接口上寫了這個(gè)注解。
也【報(bào)錯(cuò)】:在CarFun接口中找到多個(gè)非重寫的抽象方法。
我點(diǎn)進(jìn)源碼,查看了這個(gè)注解的概述。猜猜我發(fā)現(xiàn)了什么?我發(fā)現(xiàn)了一個(gè)關(guān)鍵句子:
Conceptually, a functional interface has exactly one abstract method.從概念講,一個(gè)functional interface有且僅有一個(gè)抽象方法。
進(jìn)一步百度f(wàn)unctional interface。
發(fā)現(xiàn)這個(gè)是函數(shù)式接口的意思。
結(jié)合上面百度到的:@FunctionalInterface會(huì)告訴編譯器可以用Lambda表達(dá)式。
說(shuō)明:Lambda表達(dá)式替換接口式匿名內(nèi)部類時(shí),這個(gè)匿名內(nèi)部類相對(duì)應(yīng)的接口只能有一個(gè)抽象方法。
結(jié)論:Lambda表達(dá)式替代接口式匿名內(nèi)部類時(shí),相對(duì)應(yīng)的接口是一個(gè)函數(shù)式接口。
進(jìn)一步,查看Predicate源碼時(shí)發(fā)現(xiàn),函數(shù)式接口只有一個(gè)抽象方法,但可以有多個(gè)default修飾的非抽象的方法,或者非抽象的靜態(tài)方法。
考證*2:
進(jìn)一步百度,了解,Lambda表達(dá)式替代匿名內(nèi)部類,指就是上述結(jié)論中的情況,替代接口式匿名內(nèi)部類,不是替代繼承式匿名內(nèi)部類。
考證*1:
從替代接口式匿名內(nèi)部類角度看:花括號(hào)方法體中不定義新的方法,也不寫方法名,直接寫重寫的代碼執(zhí)行語(yǔ)句即可。
有待進(jìn)一步考證*1
總結(jié)
以上是生活随笔為你收集整理的Lambda表达式及应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 精通ASP.NET MVC ——URL和
- 下一篇: oracle gets/exec 单位,