JDK1.8及以上的Lambda表達式(不足之處,還望大佬指正)
這是一個在java jdk1.8及以上出現的一個重量級新特性,這是一個新的程式設計思想(函數式程式設計思想)的轉變—強調做什麼,而不是以什麼形式做.
這樣官方的解釋,我也很懵啊,舉一個小小的例子吧,在生活中相信大家都感受過春節回家的痛苦吧,往往都是一張回家票難求啊, 這個時候就不管有什麼票了,高鐵票啊,飛機票啊,汽車票啊,隻要能回家,什麼票都行(這就是展現了函數式程式設計思想,隻要能達到目的,通過什麼方式不是重要的,方式隻是一種手段)
這個時候就出現了帥氣的Lambda表達式.不管是在代碼的間接度上,還是效率上,都是比之前的匿名内部類要好上不少.
lambda的标準格式:(參數類型 參數名稱) -> {代碼語句}
格式說明:
- 小括号内的文法與傳統方法(接口的抽象方法)參數清單一緻:無參數則留白;多個參數則用逗号分隔。
- ->是新引入的文法格式,代表指向動作。
- 大括号内的文法與傳統方法體(實作抽象方法的方法體)要求基本一緻。
使用前提:
- 使用Lambda必須具有接口,且要求接口中有且僅有一個抽象方法。
- 使用Lambda必須具有上下文推斷。
舉一個簡單的例子吧:
這是大家所常用的多線程代碼:
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("子線程代碼" + i);
}
}
}).start();
}
這是Lambda對于多線程的寫法:
public static void main(String[] args) {
//Lambda寫法,因為run()方法無參,是以隻寫小括号
new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("子線程代碼" + i);
}
}).start();
}
以上的兩個例子都是一樣的效果.
講講Lambda的省略格式:
- 小括号内參數的類型可以省略;
- 如果小括号内有且僅有一個參,則小括号可以省略;
- 如果大括号内有且僅有一個語句,則無論是否有傳回值,都可以省略大括号、return關鍵字及語句分号(要大括号,return,分号要同時省略)。
再來一個省略的Lambda例子:
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
//給集合添加資料
Collections.addAll(list, 5, 8, 2, 9, 4);
//使用Lambda表達式書寫降序規則
Collections.sort(list, (o1, o2) -> o2 - o1);
System.out.println(list);//[9, 8, 5, 4, 2]
}
确實是比匿名内部類好用的多,代碼簡潔,有逼格!