java8新發布特性,lambda是以簡短的代碼實現邏輯的形式,如 x-> x +1。下面看個例子來說明表達式如何工作的,開啟一個線程並運行方法
java8之前做法:
new Thread(new Runable() {
@Overide
public void run() {
System.out.println("run...");
}
}).start();
java8之后做法:
new Thread(() -> { System.out.println("run..."); }).start();
由上可看出,lambda代碼要少很多,還很優雅,容易理解。
lambda定義形式:
(參數類型 x, 參數類型 y) -> { 業務代碼體 }
例:
接口1:
interface Test {
int run(int x, int y);
}
class TestCC {
static void exec(Test test) {
test.run(10, 30);
}
}
TestCC.exec((int x, int y) -> x + y); // 如果只有一行,則不需要{ } ,里面執行的結果就是返回值。也可以不用寫參數類型,直接寫x, y。如果無任何參數則()即可。如果有多行代碼體,則用 {}括起來,並用return 返回值。
以上代碼編譯器會自動找到Test的run方法進行匹配實現,如果接口中有多個方法,則編譯器會報錯,因為表達式不知道匹配哪個方法,除非使用default。
表達式優點:代碼簡潔,美觀,優雅。
表達式缺點:接口必須只有一個非default方法;定義了一個方法,以后就不能擴展接口方法,不然在客戶端調用的所有表達式都會出錯,所以這只能適用於接口方法非常固定的情況下,我建議還是寫多點代碼增加靈活性。而C#則無此問題,因為C#不是用接口實現,是用委托實現,委托只對應一種類型方法。