Lambda表達式
函數式編程思想概述
---強調做什么,而不是以什么形式做
面向對象的思想:
- 做一件事情,找一個能解決這個的事情的對象,調用對象的方法,完成事情
函數式編程思想
- 只要能獲取到結果,誰去做的,這么做的都不重要,重視的是結果,不重視過程
傳統寫法和Lambda寫法對比
傳統寫法
public class CaiNiao{
public static void main(String[] args){ //匿名內部類,實現多線程 //Runnable task = new Runnable() Runnable task = new Runnable(){ @Override public void run(){//覆蓋重寫抽象方法 System.out.println(Thread.currentThread().getName()+"新線程創建了"); System.out.println("多線程任務執行!"); } }; new Thread(task).start();//開啟線程 } }
匿名內部類的好處與弊端
- 一方面,匿名內部類可以幫助我們省去實現類的定義;
- 另一方面,匿名內部類的語法確實太復雜了
public class CaiNiao{
public static void main(String[] args){ //匿名內部類,實現多線程 //Runnable task = new Runnable() new Thread(new Runnable(){ @Override public void run(){//覆蓋重寫抽象方法 System.out.println(Thread.currentThread().getName()+"新線程創建了"); System.out.println("多線程任務執行!"); } }).start();//開啟線程 } }
Lambda寫法
()->{}
public class CaiNiao{
public static void main(String[] args){ //匿名內部類,實現多線程 //Runnable task = new Runnable() new Thread(()->{//覆蓋重寫抽象方法 System.out.println(Thread.currentThread().getName()+"新線程創建了"); System.out.println("多線程任務執行!"); } ).start();//開啟線程 } }
Lambda表達式的標准格式
由三部分組成:
- 一些參數
- 一個箭頭
- 一段代碼
格式:
- (參數列表)-> {一些重寫方法的代碼}:
解釋說明格式:
- ():接口中抽象方法的參數列表,沒有參數,就空着
- ->:傳遞的意思,把參數傳遞給方法體{}
- {}:重寫接口的抽象方法的方法體
Lambda表達式:是可推導,可以省略
- 凡是根據上下文推導出來的內容,都可以省略書寫
可以省略的內容:
- (參數列表):括號中的參數列表的數據類型,可以省略不寫
- (參數列表):括號中的參數如果只有一個,那么類型和()都可以省略
- (一些代碼):如果()中的代碼只有一行,無論是否由返回值,都可以省略({},return,分號)
注意:要省略{},return,分號必須一起省略
- JDK1.7 版本之前,創建集合對象必須把前后的泛型都寫上
- JDK1.7 版本之后,=號后邊的泛型可以省略,后邊的泛型可以根據前邊的泛型推導出來
new Thread(()->{//覆蓋重寫抽象方法
System.out.println(Thread.currentThread().getName()+"新線程創建了");
}
).start();//開啟線程
new Thread(()->System.out.println(Thread.currentThread().getName()+"新線程創建了")).start();//開啟線程
Lambda的使用前提
- 使用Lambda必須具有接口,且要求接口中有且僅有一個抽象方法;
- 使用Lambda必須具有上下文推斷。
備注:有且僅有一個抽象方法的接口,成為“函數式接口”。