【Java進(jìn)階】之Java8新特性Lambda表達(dá)式

自從Java8出現(xiàn)以來(lái)症脂,受到開發(fā)者青睞的要屬它的Lambda表達(dá)式啦皇型。Lambda表達(dá)式的出現(xiàn)默垄,有兩大明顯的優(yōu)點(diǎn):一是程序員開發(fā)的代碼量大大減少;二是由于Lambda表達(dá)式本身新的特性會(huì)使代碼的運(yùn)行效率大幅度提升巫湘。

Lambda表達(dá)式特性

  • 代碼量減少
  • 運(yùn)行效率提高
  • 代碼可讀性提升
  • 強(qiáng)大的Stream API(對(duì)集合對(duì)象進(jìn)行各種串行或并發(fā)聚集操作)
  • 并行性

Lambda語(yǔ)法

1. 基本語(yǔ)法

(parameters) -> expression 或 (parameters) ->{ statements; }
即: 參數(shù) -> 帶返回值的表達(dá)式/無(wú)返回值的陳述

  • 接收2個(gè)int型整數(shù),返回他們的和
    (int x, int y) -> x + y;
  • 接受一個(gè) string 對(duì)象,并在控制臺(tái)打印,不返回任何值(看起來(lái)像是返回void)
    (String s) -> System.out.print(s);
  • 當(dāng)方法不修改lambda表達(dá)式提供的參數(shù)時(shí)装悲,Lambda表達(dá)式內(nèi)可以使用方法引用
    list.forEach(n -> System.out.println(n));
    list.forEach(System.out::println); // 使用方法引用,見(jiàn)符號(hào)::

2.語(yǔ)法詳解

根據(jù)上面的描述尚氛,我們可以簡(jiǎn)單的抽象一下Lambda表達(dá)式的一般語(yǔ)法:

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
   statment1;
   statment2;
   //.............
   return statmentM;
}
// 對(duì)一個(gè)字符串列表诀诊,將字符串包含的字符串都轉(zhuǎn)換為小寫
List<String> lowercaseNames = names.stream().map((String name) -> {return name.toLowerCase();}).collect(Collectors.toList());

根據(jù)上面的語(yǔ)義,可以將Lambda表達(dá)式簡(jiǎn)單的理解為“一段帶有參數(shù)的可執(zhí)行語(yǔ)句塊”阅嘶。
上面的Lambda表達(dá)式語(yǔ)法可以認(rèn)為是最全的版本属瓣,寫起來(lái)還是稍稍有些繁瑣。別著急讯柔,下面陸續(xù)介紹一下Lambda表達(dá)式的各種簡(jiǎn)化版:

  • 參數(shù)類型省略–絕大多數(shù)情況抡蛙,編譯器都可以從上下文環(huán)境中推斷出Lambda表達(dá)式的參數(shù)類型。這樣Lambda表達(dá)式就變成了:
(param1,param2, ..., paramN) -> {
  statment1;
  statment2;
  //.............
  return statmentM;
}
List<String> lowercaseNames = names.stream().map((name) -> {return name.toLowerCase();}).collect(Collectors.toList());
  • 當(dāng)Lambda表達(dá)式的參數(shù)個(gè)數(shù)只有一個(gè)魂迄,可以省略小括號(hào)粗截。Lambda表達(dá)式簡(jiǎn)寫為:
 param1 -> {
  statment1;
  statment2;
  //.............
  return statmentM;
} 
List<String> lowercaseNames = names.stream().map(name -> {return name.toLowerCase();}).collect(Collectors.toList());  
  • 當(dāng)Lambda表達(dá)式只包含一條語(yǔ)句時(shí),可以省略大括號(hào)捣炬、return和語(yǔ)句結(jié)尾的分號(hào)熊昌。Lambda表達(dá)式簡(jiǎn)化為:
param1 -> statment
List<String> lowercaseNames = names.stream().map(name -> name.toLowerCase()).collect(Collectors.toList());
  • 使用方法引用,如下:
List<String> lowercaseNames = names.stream().map(String::toLowerCase).collect(Collectors.toList());

stream API簡(jiǎn)單介紹

1.什么是stream

簡(jiǎn)單而言湿酸,stream就是JAVA8提供的對(duì)于元素集合統(tǒng)一婿屹、快速、并行的一種方法推溃。它能充分運(yùn)用多核的優(yōu)勢(shì)昂利,以及配合lambda表達(dá)式、鏈?zhǔn)浇Y(jié)構(gòu)對(duì)集合等進(jìn)行許多有用的操作铁坎。
概念
可以支持順序和并行對(duì)原始操作的元素集合蜂奸。
作用
提供了一種操作[大數(shù)據(jù)]接口,讓數(shù)據(jù)操作更容易和更快使用stream硬萍,從而能夠?qū)ollection的元素進(jìn)行過(guò)濾扩所、映射、排序襟铭、去重等許多操作。
中間方法和終點(diǎn)方法
它具有過(guò)濾、映射以及減少遍歷數(shù)等方法寒砖,這些方法分兩種:中間方法和終端方法赐劣。
“流”抽象天生就該是持續(xù)的,中間方法永遠(yuǎn)返回的是stream哩都,因此如果我們要獲取最終結(jié)果的話魁兼,必須使用終點(diǎn)操作才能收集流產(chǎn)生的最終結(jié)果。區(qū)分這兩個(gè)方法是看他的返回值漠嵌,如果是stream則是中間方法咐汞,否則是終點(diǎn)方法。

2.如何使用stream

  • 通過(guò)Stream接口的靜態(tài)工廠方法(注意:Java8里接口可以帶靜態(tài)方法)儒鹿;
  • 通過(guò)Collection接口的默認(rèn)方法(默認(rèn)方法:Default method化撕,也是Java8中的一個(gè)新特性,就是接口中的一個(gè)帶有實(shí)現(xiàn)的方法)–stream()约炎,把一個(gè)Collection對(duì)象轉(zhuǎn)換成Stream植阴。
    一般情況下,我們都使用Collection接口的 .stream()方法得到stream圾浅。

3.常見(jiàn)的中間方法

中間方法即是對(duì)元素進(jìn)行的操作掠手,例如過(guò)濾、去重狸捕、轉(zhuǎn)換喷鸽、截取等。

  • 過(guò)濾 filter
//過(guò)濾18歲以上的人
List persons = …
//注意灸拍!此處返回的是Stream
Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18); 
  • 轉(zhuǎn)換 map
//把person轉(zhuǎn)成Adult
Stream map = persons.stream().filter(p -> p.getAge() > 18).map(person -> new Adult(person)); 
  • 去重 distinct
  • 截取 limit

4.常見(jiàn)的終點(diǎn)方法

通過(guò)中間方法做祝,我們對(duì)stream進(jìn)行了一系列的操作,但得到的還是一個(gè)stream株搔。要是想把它轉(zhuǎn)為新的集合或者是統(tǒng)計(jì)結(jié)果剖淀,我們需要使用終點(diǎn)方法。

  • 統(tǒng)計(jì) count
    count方法是一個(gè)流的終點(diǎn)方法纤房,可使流的結(jié)果最終統(tǒng)計(jì)纵隔,返回int,比如我們計(jì)算一下滿足18歲的總?cè)藬?shù)
int countOfAdult=persons.stream().filter(p -> p.getAge() > 18)
.map(person -> new Adult(person))
.count();
  • 收集流的結(jié)果 collect
    collect方法也是一個(gè)流的終點(diǎn)方法炮姨,可收集最終的結(jié)果
List adultList= persons.stream().filter(p -> p.getAge() > 18)
.map(person -> new Adult(person))
.collect(Collectors.toList());
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捌刮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舒岸,更是在濱河造成了極大的恐慌绅作,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛾派,死亡現(xiàn)場(chǎng)離奇詭異俄认,居然都是意外死亡个少,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門眯杏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夜焦,“玉大人,你說(shuō)我怎么就攤上這事岂贩∶>” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵萎津,是天一觀的道長(zhǎng)卸伞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)锉屈,這世上最難降的妖魔是什么荤傲? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮部念,結(jié)果婚禮上弃酌,老公的妹妹穿的比我還像新娘。我一直安慰自己儡炼,他們只是感情好妓湘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乌询,像睡著了一般榜贴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妹田,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天唬党,我揣著相機(jī)與錄音,去河邊找鬼鬼佣。 笑死驶拱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晶衷。 我是一名探鬼主播蓝纲,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼晌纫!你這毒婦竟也來(lái)了税迷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锹漱,失蹤者是張志新(化名)和其女友劉穎箭养,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哥牍,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毕泌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年喝检,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撼泛。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛇耀,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坎弯,到底是詐尸還是另有隱情,我是刑警寧澤译暂,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布抠忘,位于F島的核電站,受9級(jí)特大地震影響外永,放射性物質(zhì)發(fā)生泄漏崎脉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一伯顶、第九天 我趴在偏房一處隱蔽的房頂上張望囚灼。 院中可真熱鬧,春花似錦祭衩、人聲如沸灶体。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝎抽。三九已至,卻和暖如春路克,著一層夾襖步出監(jiān)牢的瞬間樟结,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工精算, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓢宦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓灰羽,卻偏偏與公主長(zhǎng)得像驮履,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谦趣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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