Lambda表達式的使用及注意事項
Lambda表達式的使用
練習:
- 定義一個接口flyable,里面定義一個抽象方法 void fly(String s)
- 定義一個測試類flyabledemo,在測試類中提供兩個方法
一個方法是useFlyable(Flyable f)
主方法,在主方法中調用useflyable方法
package Demo16; public interface Flyable { void fly(String s ); }
package Demo16; import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput; public class FlyableDemo { public static void main(String[] args) { useFlyable(new Flyable() { @Override public void fly(String s) { System.out.println(s); System.out.println("飛機自駕游"); } }); System.out.println("----------------"); useFlyable( (String s ) -> { System.out.println(s); System.out.println("飛機自駕游"); }); } private static void useFlyable(Flyable f){ f.fly("風和日麗,晴空萬里"); } }
練習2
- 定義一個接口(Addable),里面定義一個抽象方法, int add(int x ,int y)
- 定義一個測試類(AddableDemo),在測試類中提供兩個方法
一個方法是:useAddable(Addable)
一個主方法是,在主方法中調用useAddable方法
package Demo17; public interface Addable { int add(int x ,int y); }
package Demo17; public class AddableDemo { public static void main(String[] args) { //在主方法中調用useAddable方法 useAddable( (int x ,int y ) ->{ return x+y;//簡化重寫方法可以看做 }); } private static void useAddable(Addable a){ int sum = a.add(10, 20); System.out.println(sum); } }
Lambda表達式的省略模式
省略規(guī)則:
- 參數(shù)類型可以省略,但是有多個參數(shù)的情況下,不能只省略一個
- 如果參數(shù)有且僅有一個,那么小括號可以省略
- 如果代碼塊的語句只有一條,可以省略大括號和分號,甚至是return。
package Demo17; public class AddableDemo { public static void main(String[] args) { //在主方法中調用useAddable方法 // useAddable( (int x ,int y ) ->{ // return x+y;//簡化重寫方法可以看做 //參數(shù)的類型可以省略 // useAddable( (x,y) -> { // return x+y; // }); // //類型雖然可以省略,但是有多個參數(shù)的情況下不能只省略一個 // useFlyable( (String s ) -> { // System.out.println(s); // });//如果參數(shù)有且僅有一個,小括號可以省略 // useFlyable( s -> { // System.out.println(s); // }); //如果代碼塊的語句只有一條,可以省略大括號和分號 useFlyable( s -> System.out.println(s)); //useAddable( (x,y) -> return x+y);//如果有return,return也要省略,只針對代碼塊只有一條的情況 useAddable( (x,y) -> x+y); } private static void useAddable(Addable a){ int sum = a.add(10, 20); System.out.println(sum); } private static void useFlyable(Flyable f){ f.fly("風和日麗,晴空萬里"); } }
Lambda使用注意事項
- 使用Lambda必須要有接口,并且接口中有且僅有一個抽此昂方法
- 必須有上下文環(huán)境,才能推導出lambda對應接口
根據(jù)局部變量的賦值得知lambda對應的接口:Runnable r = () -> System.out.println("lambda表達式");
根據(jù)調用方法的參數(shù)得知lambda對應的接口:new Thread( () -> System.out.println("lambda表達式")).start();
package Demo18; public class LambdaDemo { public static void main(String[] args) { // useInter( () -> { // System.out.println("好好學習,天天向上"); // }); //使用Lambda必須要有接口,并且接口有且僅有一個抽象方法 useInter( () -> System.out.println("好好學習,天天向上")); //必須要有上下文華寧,才能推導出lambda對應接口 // new Thread(new Runnable() { // @Override // public void run() { // System.out.println("匿名內部類"); // } // }); Runnable r = () -> System.out.println("lambda表達式"); new Thread(r).start(); new Thread( () -> System.out.println("lambda表達式")).start(); } private static void useInter(Inter i ){ i.show(); } }
Lambda表達式和匿名內部類的區(qū)別
所需類型不同:
- 匿名內部類:可以是接口,也可以是抽象類,還有可以是具體類
- lambda表達式:只能是接口
使用限制不同:
- 如果接口中有且僅有一個抽象方法,可以使用lambda表達式,也可以使用匿名內部類
- 如果接口中多于一個抽象方法,只能使用匿名內部類,而不能使用lambda比表達式
實現(xiàn)原理不同:
- 匿名內部類:編譯之后,產生一個單獨的.class字節(jié)碼文件
- lambda表達式:編譯之后,沒有一個單獨的.class文件,對應哪個的字節(jié)碼會在運行的時候動態(tài)生成
package Demo19; public class LambdaDemo { public static void main(String[] args) { ////匿名內部類,接口可以使用多個抽象方法 // useInter(new Inter() { // @Override // public void show1() { // System.out.println("接口"); // } // public void show2() { // System.out.println("接口"); // } // }); // useAnimal(new Animal() { // @Override // public void method() { // System.out.println("抽象類"); // } // }); // useStudent(new Student(){ // @Override // public void study(){ // System.out.println("具體類"); // } // }); //lambda,接口有且僅有一個抽象方法 // useInter( () -> System.out.println("接口")); //useAnimal(() -> System.out.println("接口")); // useStudent(() -> System.out.println("具體類")); //使用lambda的地方參數(shù)必須是一個接口(有且只有一個) } private static void useStudent(Student s ){s.study();} private static void useAnimal(Animal a ){a.method();} private static void useInter(Inter i ){i.show1();i.show2();} }
到此這篇關于Lambda表達式的使用及注意事項的文章就介紹到這了,更多相關Lambda表達式 內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Jdk11使用HttpClient提交Http2請求的實現(xiàn)方法
這篇文章主要介紹了Jdk11使用HttpClient提交Http2請求的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08SpringBoot 使用@WebMvcTest測試MVC Web Controller
這篇文章主要介紹了SpringBoot 使用@WebMvcTest測試MVC Web Controller,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11mybatis mapper.xml 區(qū)間查詢條件詳解
這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09一文了解SpringBoot是如何連接數(shù)據(jù)庫的
Spring Boot提供了一系列的開箱即用的功能和特性,使得開發(fā)人員可以快速構建和部署應用程序,下面這篇文章主要給大家介紹了關于SpringBoot是如何連接數(shù)據(jù)庫的相關資料,需要的朋友可以參考下2023-06-06java中優(yōu)化大量if...else...方法總結
在我們平時的開發(fā)過程中,經(jīng)??赡軙霈F(xiàn)大量If else的場景,代碼顯的很臃腫,非常不優(yōu)雅,下面這篇文章主要給大家介紹了關于java中優(yōu)化大量if...else...方法的相關資料,需要的朋友可以參考下2023-03-03mybatis Plus 多表聯(lián)合查詢的實現(xiàn)示例
這篇文章主要介紹了mybatis Plus 多表聯(lián)合查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09