函數式程式設計思想
函數是有輸入,有輸出的額一個過程,面向對象思想強調的是一切必須通過對象的形式來做事情,
函數式思想則盡量忽略面向對象的複雜文法,強調做什麼,而不是以什麼形式去做,
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位元組碼檔案,對應的位元組碼會在運作時動态生成