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