Java8詳解之lambda表達(dá)式

轉(zhuǎn)載請(qǐng)務(wù)必注明原文鏈接地址:http://tantanit.com/java8-lambda/
Java8中引入了lambda表達(dá)式,從行為參數(shù)化的角度,在使用時(shí),將行為作為參數(shù),去除包圍在外層的不必要的類聲明,使代碼更加簡(jiǎn)潔。

lambda表達(dá)式的語(yǔ)法

lambda表達(dá)式由參數(shù),->,以及函數(shù)體三部分組成。其實(shí)函數(shù)體可以是表達(dá)式,也可以是語(yǔ)句。語(yǔ)句應(yīng)該包含在{}里,而表達(dá)式不能。

lambda表達(dá)式舉例

(List<String> list) -> list.isEmpty() //布爾類型表達(dá)式
() -> new Apple(10) //創(chuàng)建一個(gè)新對(duì)象
(Apple a) -> { System.out.println(a.getWeight()); }  //使用一個(gè)對(duì)象的屬性
(String s) -> s.length() //選擇或提取一個(gè)對(duì)象的屬性
(int a, int b) -> a * b //組合兩個(gè)參數(shù)
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) //比較兩個(gè)對(duì)象

行為參數(shù)化

可以看到,lambda表達(dá)式著重表達(dá)了行為。其實(shí)在java8之前,就已經(jīng)有類似將行為作為參數(shù)進(jìn)行處理的例子:

// 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());
  }
});

在上面的例子中,定義了一個(gè)Comparator接口,并且定義了compare方法。List類型的inventory,定義了sort方法,該方法以Comparator作為參數(shù)。在使用時(shí),生成一個(gè)匿名或不匿名的Comparator對(duì)象,該對(duì)象實(shí)現(xiàn)了compare方法,指定了具體的比較行為,再將Comparator對(duì)象作為參數(shù),傳給sort方法。實(shí)際上的作用,就是將比較行為,作為參數(shù),傳給sort方法,這種思想和做法就叫作“行為參數(shù)化”。一個(gè)使用的方法(比如sort方法)可以對(duì)應(yīng)多種行為,當(dāng)需要更改行為時(shí),只需要修改表示行為的代碼,使用方不必做出修改,增加了代碼的健壯性。

匿名內(nèi)部類

而像上面的例子中,直接new一個(gè)Comparator類型對(duì)象,而沒(méi)有定義一個(gè)變量保存該對(duì)象的引用,叫做使用匿名內(nèi)部類。在匿名內(nèi)部類的情況下,由于方法不能重復(fù)使用,可以更加明顯地看到代碼的冗余。因?yàn)槊看卧谑褂脮r(shí)需要手動(dòng)new一個(gè)對(duì)象,并且還要寫出compare方法的簽名,而真正有用的其實(shí)只是compare的方法體。在Java8中,使用lambda表達(dá)式,可以簡(jiǎn)化這些代碼。比如上面的sort方法的使用,可以簡(jiǎn)化為:

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");
  }
});

可以簡(jiǎn)化為:

Thread t = new Thread(() -> System.out.println("Hello world"));

GUI中點(diǎn)擊事件的例子:

Button button = new Button("Send");
button.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
      label.setText("Sent!!");
    }
 });

可以簡(jiǎn)化為:

Button button = new Button("Send");
button.setOnAction((ActionEvent event) -> label.setText("Sent!!"));

可以看出,lambda表達(dá)式更加簡(jiǎn)潔,也可以使開(kāi)發(fā)者在讀寫代碼時(shí),可以更加專注在定義的行為上。

小結(jié)

這篇文章介紹了lambda表達(dá)式的語(yǔ)法,引入lambda表達(dá)式的使用場(chǎng)景,以及使用lambda表達(dá)式的好處。我們將在下篇文章中講解如何定義和使用lambda表達(dá)式,以及與其它語(yǔ)言相比,lambda表達(dá)式在Java中的特殊規(guī)范。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文鏈接: Lambdas 原文作者: shekhargulati 譯者: leege100 lambda表達(dá)式是...
    忽來(lái)閱讀 6,749評(píng)論 8 129
  • 簡(jiǎn)介 概念 Lambda 表達(dá)式可以理解為簡(jiǎn)潔地表示可傳遞的匿名函數(shù)的一種方式:它沒(méi)有名稱,但它有參數(shù)列表、函數(shù)主...
    劉滌生閱讀 3,344評(píng)論 5 18
  • lambda表達(dá)式(又被成為“閉包”或“匿名方法”)方法引用和構(gòu)造方法引用擴(kuò)展的目標(biāo)類型和類型推導(dǎo)接口中的默認(rèn)方法...
    183207efd207閱讀 1,551評(píng)論 0 5
  • 你要知道的Java8 匿名內(nèi)部類、函數(shù)式接口、lambda表達(dá)式與Stream API都在這里 轉(zhuǎn)載請(qǐng)注明出處 h...
    WWWWDotPNG閱讀 4,981評(píng)論 2 15
  • 人一生會(huì)有多少次遇見(jiàn)? 嫩芽初生的時(shí)候遇見(jiàn)姍姍來(lái)遲的春天。 葉落大地的時(shí)候遇見(jiàn)翩翩起舞的秋...
    花一塵閱讀 327評(píng)論 0 2

友情鏈接更多精彩內(nèi)容