【Java教程】(二):Lambda表示式
阿新 • • 發佈:2021-03-31
函數語言程式設計思想
函式是有輸入,有輸出的額一個過程,面向物件思想強調的是一切必須通過物件的形式來做事情,
函式式思想則儘量忽略面向物件的複雜語法,強調做什麼,而不是以什麼形式去做,
lambda表示式就是函數語言程式設計思想的體現
Lambda初體驗
需求:啟動一個執行緒,輸出一句話
public class Test {
public static void main(String[] args) {
//實現類的方式
//MyRunnable myRunnable = new MyRunnable();
//Thread t = new Thread(myRunnable);
//t.start()
//匿名內部類的方式
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("多執行緒啟動啦!");
}
}).start();
//lambda方式改造
new Thread( ()-> {
System. out.println("多執行緒啟動啦!");
}).start();
}
}
lambda方式分析:
- ()裡面沒內容,可以看作方法形參為空
- ->用箭頭指向後面要做的事
- { }包含一段程式碼,稱之為程式碼塊,可以看成方法體中的內容
Lambda表示式標準格式
格式:(形參)->{程式碼塊}
如果有多個形參就用逗號分開,沒有為空即可
Lambda表示式使用前提
- 有一個介面
- 介面中
有且只有一個抽象方法
Lambda表示式練習
Addable是一個介面,其中有add這個方法,執行完控制檯輸出了30,
執行lambda表示式的時候,系統偷偷的自動建立了一個物件,lambda實現了add方法
lambda表示式的結果其實就是一個實現了介面的物件,這也解釋了傳的引數應該是Addable的實現物件
public class Test {
public static void main(String[] args) {
useAddable( (int x,int y)-> {
return x+y;
});
}
private static void useAddable(Addable a) {//傳的肯定是Addable的實現物件,所以可以呼叫
int sum = a.add(10,20);
System.out.println(sum);
}
}
省略模式
- 引數型別可以省略,但是不能只省略一個,要省略全省略
- 如果引數有且僅有一個,小括號可以省略
- 如果程式碼塊的語句只有一條,可以省略大括號和分號,如果有return也要把return省略
Lambda表示式與匿名內部類的區別
# 所需型別不同
匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
Lambda表示式:只能是介面
# 使用限制不同
如果介面中有且僅有一個抽象方法,可以使用lambda表示式,也可以使用匿名內部類
如果介面有多個抽象方法,只能使用匿名內部類,不能使用lambda表示式
# 實現原理不同
匿名內部類:編譯以後產生一個單獨的.class位元組碼檔案
Lambda表示式:編譯之後沒有一個單獨的.class位元組碼檔案,對應的位元組碼會在執行時動態生成