一、什麼是函數式編程和什麼是lambda表達式
在JDK8之前,Java是不⽀持函數式編程的。
所謂的函數編程:即可理解是將⼀個函數(也稱爲“行爲”)作爲⼀個參數進⾏傳遞, ⾯向對象編程是對數據的抽象(各種各樣的POJO類),而函數式編程則是對行爲的抽象(將⾏爲作爲⼀個參數進行傳遞)
Lambda 表達式是 JDK8 的一個新特性,可以取代大部分的匿名內部類,寫出更優雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中,可以極大地優化代碼結構。
JDK 也提供了大量的內置函數式接口供我們使用,使得 Lambda 表達式的運用更加方便、高效。
二、舉例子說明
(1)java創建線程
jdk8之前創建線程
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("以前創建線程的方式");
}
});
jdk8之後使用Lambda表達式創建線程則只需要使⽤⼀句話
new Thread(() -> System.out.println("使用Lambda之後創建線程的方式"));
(2)集合容器⾥⾯的字符串排序
使⽤前
List<String> list = Arrays.asList("aaa","ggg","ffff","ccc");
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
for (String string : list) {
System.out.println(string);
}
使用後
List<String> list =Arrays.asList("aaa","ggg","ffff","ccc");
Collections.sort(list, (a,b)->b.compareTo(a)
);
for (String string : list) {
System.out.println(string);
}
三、Lambda語法講解
(1)lambda表達式 使⽤場景(前提)
⼀個接⼝中只包含⼀個⽅法,則可以使⽤Lambda表達式,這樣的接⼝稱之爲“函數接⼝”
(2)語法 (params) -> expression
第⼀部分爲括號內⽤逗號分隔的形參,參數是函數式接⼝⾥⾯⽅法的參數
第⼆部分爲⼀個箭頭符號:->
第三部分爲⽅法體,可以是表達式和代碼塊
還有以下幾點需要注意:
- 參數列表:括號中參數列表的數據類型可以省略不寫
括號中的參數只有⼀個,那麼參數類型和()都可以省略不寫
- 方法體:如果{ }中的代碼只有⼀⾏,⽆論有沒有返回值,都可以省略{ },return,分號,要⼀起省略,其他情況則需要加上
(3)好處
Lambda 表達式的實現⽅式在本質是以匿名內部類的⽅式進⾏實現
重構現有臃腫代碼,更⾼的開發效率,尤其是集合Collection操作的時候,後續會講到