Java8中的lambda表達式

lambda表達式是Java8中最重要的特性之一更舞,也是Stream,Optional等特性的基礎。盡管lambda表達式與匿名內部類在JVM層面有本質不同坎吻,但我個人還是傾向于將lambda看做匿名內部類的語法糖八秃,主要用途就是簡化代碼和增加代碼的可讀性。在學習lambda表達式之前姐仅,先要回顧一下Java中的匿名內部類仗颈。

匿名內部類

匿名內部類即沒有名字的內部類,如我們在臨時創(chuàng)建新的線程時,經常會這么寫

new Thread(new Runnable(){
  @Override
  public void run(){
    // do something
  }
})

本來應該傳給new Thread()構造函數(shù)一個實現(xiàn)了Runnable接口的類诸尽,但是如果這個類只用到一次原杂,那么還要給他命名豈不是很麻煩,所以就省略了名字您机,即用匿名內部類來代替穿肄。但我們可以發(fā)現(xiàn),即使省略了類名际看,上面的代碼看上去還是廢話很多咸产,因為其實我們只關心run方法里面的內容,其他都是沒用的廢話仲闽。

lambda表達式

lambda表達式即匿名表達式脑溢,也被稱為閉包。lambda語法如下
(parameters) -> expression 或者(parameters) -> {statement}

  • 可選參數(shù)類型聲明蔼囊,參數(shù)類型可自動推導
  • 可選的參數(shù)圓括號焚志,只有一個參數(shù)衣迷,可以省略圓括號
  • 可選的大括號 ,表達式只有一句話可以省略大括號
  • 可選的返回關鍵字酱酬,主體只有一個表達式壶谒,可以省略顯示return關鍵字,編譯器會自動返回
// 舉例如下
() -> System.out.println(x);
str -> System.out.println(str);
(int x, int y) -> x+y;
(int x, int y) -> {
  int temp1 = x+y;
  int temp2 = x-y;
  return temp1*temp2;
}

有了lambda表達式之后膳沽,我們可以大大簡化上面創(chuàng)建線程的代碼

new Thread(() -> doSomething())

函數(shù)式接口

lambda表達式能夠良好工作還離不開一個函數(shù)式接口汗菜。函數(shù)式接口是指有且僅有一個抽象方法的接口,如上面的Runnable只具有一個抽象方法void run(){},就是一個函數(shù)式接口挑社,所以函數(shù)式接口本質上和普通接口沒有什么區(qū)別陨界。

函數(shù)式接口可以使用@FunctionalInterface注解標識,被該注解標注的接口具有多個非抽象方法時痛阻,則會編譯報錯菌瘪。
lambda表達式可以直接賦值給對應函數(shù)式接口聲明的引用,如

Runnable runnable = () -> System.out.println("I am running");
runnable.run() // 輸出 I am running
new Thread(runnable).start(); // 輸出 I am running

因此阱当,我們可以直接將lambda表達式傳遞給以函數(shù)式接口作為參數(shù)的方法俏扩。以List的forEach方法為例

// List接口中的forEach定義如下,其中accept方法為Consumer接口中聲明的唯一抽象方法
default void forEach(Consumer<? super T> action){
    Objects.requireNonNull(action);
     for (T t : this) {
        action.accept(t);
     }
}

List<String> lists = Arrays.asList("a","b","c");
lists.forEach(str -> System.out.println(str.toUpperCase())); //打印輸出A B C

// 如果將上一句代碼改為匿名內部類的寫法
lists.forEach(new Consumer<String>() {
    @Override
    public void accept(String s) {
        System.out.print(s.toUpperCase());
    }
});

除了上面代碼中提到的Consumer接口,java8中還為我們提供了非常多的函數(shù)式接口弊添,如Predicate<T>接口录淡,接受一個參數(shù),返回一個boolean值油坝。具體用到嫉戚,可再做了解。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末澈圈,一起剝皮案震驚了整個濱河市彬檀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌极舔,老刑警劉巖凤覆,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链瓦,死亡現(xiàn)場離奇詭異拆魏,居然都是意外死亡,警方通過查閱死者的電腦和手機慈俯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門渤刃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贴膘,你說我怎么就攤上這事卖子。” “怎么了刑峡?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵洋闽,是天一觀的道長玄柠。 經常有香客問我,道長诫舅,這世上最難降的妖魔是什么羽利? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮刊懈,結果婚禮上这弧,老公的妹妹穿的比我還像新娘。我一直安慰自己虚汛,他們只是感情好匾浪,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卷哩,像睡著了一般蛋辈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上将谊,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天梯浪,我揣著相機與錄音,去河邊找鬼瓢娜。 笑死挂洛,一個胖子當著我的面吹牛,可吹牛的內容都是我干的眠砾。 我是一名探鬼主播虏劲,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼褒颈!你這毒婦竟也來了柒巫?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤谷丸,失蹤者是張志新(化名)和其女友劉穎堡掏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刨疼,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡泉唁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了揩慕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亭畜。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迎卤,靈堂內的尸體忽然破棺而出拴鸵,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布劲藐,位于F島的核電站八堡,受9級特大地震影響,放射性物質發(fā)生泄漏聘芜。R本人自食惡果不足惜秕重,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厉膀。 院中可真熱鬧溶耘,春花似錦、人聲如沸服鹅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽企软。三九已至庐扫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仗哨,已是汗流浹背形庭。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厌漂,地道東北人萨醒。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像苇倡,于是被迫代替她去往敵國和親富纸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344