轉(zhuǎn)載請務(wù)必注明原文鏈接地址:http://tantanit.com/java8-lambda/
Java8中引入了lambda表達式肪虎,從行為參數(shù)化的角度劣砍,在使用時,將行為作為參數(shù)扇救,去除包圍在外層的不必要的類聲明刑枝,使代碼更加簡潔香嗓。
lambda表達式的語法
lambda表達式由參數(shù),->装畅,以及函數(shù)體三部分組成靠娱。其實函數(shù)體可以是表達式,也可以是語句掠兄。語句應(yīng)該包含在{}里像云,而表達式不能。
lambda表達式舉例
(List<String> list) -> list.isEmpty() //布爾類型表達式
() -> new Apple(10) //創(chuàng)建一個新對象
(Apple a) -> { System.out.println(a.getWeight()); } //使用一個對象的屬性
(String s) -> s.length() //選擇或提取一個對象的屬性
(int a, int b) -> a * b //組合兩個參數(shù)
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) //比較兩個對象
行為參數(shù)化
可以看到蚂夕,lambda表達式著重表達了行為迅诬。其實在java8之前,就已經(jīng)有類似將行為作為參數(shù)進行處理的例子:
// java.util.Comparator
public interface Comparator<T> {
public int compare(T o1, T o2);
}
inventory.sort(new Comparator<Apple>() {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
});
在上面的例子中婿牍,定義了一個Comparator接口侈贷,并且定義了compare方法。List類型的inventory等脂,定義了sort方法俏蛮,該方法以Comparator作為參數(shù)。在使用時上遥,生成一個匿名或不匿名的Comparator對象搏屑,該對象實現(xiàn)了compare方法,指定了具體的比較行為粉楚,再將Comparator對象作為參數(shù)辣恋,傳給sort方法。實際上的作用模软,就是將比較行為抑党,作為參數(shù),傳給sort方法撵摆,這種思想和做法就叫作“行為參數(shù)化”。一個使用的方法(比如sort方法)可以對應(yīng)多種行為害晦,當(dāng)需要更改行為時特铝,只需要修改表示行為的代碼,使用方不必做出修改壹瘟,增加了代碼的健壯性鲫剿。
匿名內(nèi)部類
而像上面的例子中,直接new一個Comparator類型對象稻轨,而沒有定義一個變量保存該對象的引用灵莲,叫做使用匿名內(nèi)部類。在匿名內(nèi)部類的情況下殴俱,由于方法不能重復(fù)使用政冻,可以更加明顯地看到代碼的冗余枚抵。因為每次在使用時需要手動new一個對象,并且還要寫出compare方法的簽名明场,而真正有用的其實只是compare的方法體汽摹。在Java8中,使用lambda表達式苦锨,可以簡化這些代碼逼泣。比如上面的sort方法的使用,可以簡化為:
inventory.sort( (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight() ) );
定義線程的例子:
Thread t = new Thread(new Runnable() {
public void run(){
System.out.println("Hello world");
}
});
可以簡化為:
Thread t = new Thread(() -> System.out.println("Hello world"));
GUI中點擊事件的例子:
Button button = new Button("Send");
button.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent event) {
label.setText("Sent!!");
}
});
可以簡化為:
Button button = new Button("Send");
button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));
可以看出舟舒,lambda表達式更加簡潔拉庶,也可以使開發(fā)者在讀寫代碼時,可以更加專注在定義的行為上秃励。
小結(jié)
這篇文章介紹了lambda表達式的語法氏仗,引入lambda表達式的使用場景,以及使用lambda表達式的好處莺治。我們將在下篇文章中講解如何定義和使用lambda表達式廓鞠,以及與其它語言相比,lambda表達式在Java中的特殊規(guī)范谣旁。