以下語法來自于Java8
Lambda是一種匿名函數,函數的作用是接受一個輸入,得到一個輸出(也可能不需要輸出,僅利用其執行的副作用)。
利用Lambda可以封裝變化,寫出更靈活的代碼。
舉一個例子
假如有這樣一個類
public Person {
String firstName;
String lastName;
}
如果想將Person作為一個String輸出,以西方的習慣,可以定義一個成員函數
public String printWestern() {
System.out.println(lastName + " " + firstName);
}
這時如果有一個需要變化,想要以東方的方式輸出,則需要修改源代碼,再添加一個成員函數
public String printEastern() {
System.out.println(firstName + " " + lastName);
}
如果還想以其它方式輸出呢?是不是還需要修改源代碼,重新編譯?
這里,變化的是輸出的方式。而輸出方式卻是由函數定義的。
暫時放下,想想另一個話題-變量
對以下代碼
foobar.setWidth(8);
都知道需要設置一個變量,然后再傳入進入
int width = 8;
foobar.setWidth(width);
這樣變量的值可以在運行時,從數據庫讀入,交互方式輸入,或從文件讀入,這樣就可以不改變源代碼,從而改變程序的行為。
如果函數也可以像變量一樣,豈不可以改善前面的問題了嗎?
Lambda就是一種方法。
利用Lambda后可以這樣寫
public String printCustom(Function<Person, String) f) {
return f.apply(this);
}
客戶程序可以這樣
Function<Person, String> westernStyle = p -> {
return lastName + " " + firstName;
}
person.printCustom(westernStyle);
Function<Person, String> easternStyle = p -> {
return firstName + " " + lastName;
}
person.printCustom(easternStyle);
這里,函數就可以將變量一樣使用了。
如果在一個程序語言中,函數
- 可以賦值給變量
- 做為形參傳入另一函數
- 做為函數返回值返回
那么可以稱其為first class citizen
注:
以上例子來自于Lambda Qucik Start,更詳細的介紹請參考原文。