Java8詳解之lambda表達式

轉(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ī)范谣旁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末床佳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子榄审,更是在濱河造成了極大的恐慌砌们,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搁进,死亡現(xiàn)場離奇詭異浪感,居然都是意外死亡,警方通過查閱死者的電腦和手機饼问,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門影兽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莱革,你說我怎么就攤上這事峻堰。” “怎么了盅视?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵捐名,是天一觀的道長。 經(jīng)常有香客問我闹击,道長镶蹋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮贺归,結(jié)果婚禮上淆两,老公的妹妹穿的比我還像新娘。我一直安慰自己牧氮,他們只是感情好琼腔,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踱葛,像睡著了一般丹莲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尸诽,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天甥材,我揣著相機與錄音,去河邊找鬼性含。 笑死洲赵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的商蕴。 我是一名探鬼主播叠萍,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绪商!你這毒婦竟也來了苛谷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤格郁,失蹤者是張志新(化名)和其女友劉穎腹殿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體例书,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡锣尉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了决采。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片自沧。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖树瞭,靈堂內(nèi)的尸體忽然破棺而出暂幼,到底是詐尸還是另有隱情,我是刑警寧澤移迫,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站管行,受9級特大地震影響厨埋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捐顷,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一荡陷、第九天 我趴在偏房一處隱蔽的房頂上張望雨效。 院中可真熱鬧,春花似錦废赞、人聲如沸徽龟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽据悔。三九已至,卻和暖如春耘沼,著一層夾襖步出監(jiān)牢的瞬間极颓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工群嗤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留菠隆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓狂秘,卻偏偏與公主長得像骇径,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子者春,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

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