Java 8 Lambda表達(dá)式

一、Lambda簡介

Lambda 表達(dá)式是 JDK8 的一個(gè)新特性酪我,可以取代大部分的匿名內(nèi)部類消痛,寫出更優(yōu)雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中都哭,可以極大地優(yōu)化代碼結(jié)構(gòu)秩伞。

JDK 也提供了大量的內(nèi)置函數(shù)式接口供我們使用,使得 Lambda 表達(dá)式的運(yùn)用更加方便欺矫、高效纱新。

Lambda表達(dá)式允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞到方法中)。lambda表達(dá)式是一個(gè)可傳遞的代碼塊汇陆,可以在以后執(zhí)行一次或多次怒炸,它可以傳遞到函數(shù)式接口带饱。

二毡代、Lambda 基礎(chǔ)語法

語法形式為 () -> {},其中 () 用來描述參數(shù)列表勺疼,{} 用來描述方法體教寂,-> 為 lambda運(yùn)算符 ,讀作(goes to)执庐。

(parameters) -> expression

(parameters) ->{ statements; }

Lambda 語法簡化

1.簡化參數(shù)類型酪耕,可以不寫參數(shù)類型,但是必須所有參數(shù)都不寫轨淌;

2.簡化參數(shù)小括號迂烁,如果只有一個(gè)參數(shù)則可以省略參數(shù)小括號;

3.簡化方法體大括號递鹉,如果方法條只有一條語句盟步,則可以省略方法體大括號;

4.簡化返回關(guān)鍵字躏结,如果方法體只有一條語句却盘,并且是 return 語句,則可以省略方法體大括號及返回關(guān)鍵字return媳拴。

三黄橘、變量作用域

Lambda表達(dá)式只能引用標(biāo)記了final的外層局部變量,即不能在Lambda內(nèi)部修改定義在外層的局部變量屈溉,否則會編譯報(bào)錯(cuò)塞关。外層的局部變量可以不用聲明為final,但是必須不可被后面的代碼修改(即隱性的具有final的語義)子巾。

在Lambda表達(dá)式中不允許聲明一個(gè)與外層的局部變量同名的參數(shù)或者局部變量帆赢。

四驶睦、方法引用

方法引用通過方法的名字來指向一個(gè)方法,可以使語言的構(gòu)造更緊湊簡潔匿醒,減少冗余代碼场航,方法引用使用一對冒號 :: 。

語法

? 方法歸屬者::方法名 靜態(tài)方法的歸屬者為類名廉羔,普通方法歸屬者為對象溉痢。

構(gòu)造器引用:它的語法是Class::new,或者更一般的Class< T >::new憋他。

靜態(tài)方法引用:它的語法是Class::static_method孩饼。

特定類的任意對象的方法引用:它的語法是Class::method。

特定對象的方法引用:它的語法是instance::method竹挡。

五镀娶、函數(shù)式接口

函數(shù)式接口(Functional Interface)就是一個(gè)有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口揪罕。

函數(shù)式接口可以被隱式轉(zhuǎn)換為 lambda 表達(dá)式梯码。

JDK 1.8 之前已有的函數(shù)式接口:

java.lang.Runnable

java.util.concurrent.Callable

java.security.PrivilegedAction

java.util.Comparator

java.io.FileFilter

java.nio.file.PathMatcher

java.lang.reflect.InvocationHandler

java.beans.PropertyChangeListener

java.awt.event.ActionListener

javax.swing.event.ChangeListener

JDK 1.8 新增加的函數(shù)接口:

java.util.function

java.util.function 它包含了很多類,用來支持 Java的函數(shù)式編程好啰。

1.新注解@FunctionalInterface

Java 8為函數(shù)式接口引入了一個(gè)新注解@FunctionalInterface轩娶,主要用于編譯級錯(cuò)誤檢查,加上該注解框往,當(dāng)你寫的接口不符合函數(shù)式接口定義的時(shí)候鳄抒,編譯器會報(bào)錯(cuò)。

提醒:加不加 @FunctionalInterface 對于接口是不是函數(shù)式接口沒有影響椰弊,該注解只是提醒編譯器去檢查該接口是否僅包含一個(gè)抽象方法许溅。

2.函數(shù)式接口里允許定義默認(rèn)方法

函數(shù)式接口里可以包含默認(rèn)方法,因?yàn)槟J(rèn)方法不是抽象方法秉版,其有一個(gè)默認(rèn)實(shí)現(xiàn)贤重,所以是符合函數(shù)式接口的定義的。

實(shí)現(xiàn)接口后沐飘,因?yàn)槟J(rèn)方法不是抽象方法游桩,所以可以不重寫,但是如果開發(fā)需要耐朴,也可以重寫 借卧。如果接口中的默認(rèn)方法不能滿足某個(gè)實(shí)現(xiàn)類需要,那么實(shí)現(xiàn)類可以覆蓋默認(rèn)方法筛峭。簽名跟接口default方法一致铐刘,但是不能再加default修飾符。

3.函數(shù)式接口里允許定義 java.lang.Object 里的 public 方法

函數(shù)式接口里是可以包含Object里的public方法影晓,這些方法對于函數(shù)式接口來說镰吵,不被當(dāng)成是抽象方法(雖然它們是抽象方法)檩禾;因?yàn)槿魏我粋€(gè)函數(shù)式接口的實(shí)現(xiàn),默認(rèn)都繼承了 Object 類疤祭,包含了來自 java.lang.Object 里對這些抽象方法的實(shí)現(xiàn)盼产。

4.常用函數(shù)式接口

圖片發(fā)自簡書App

Supplier<T>,主要方法:T get(),這是一個(gè)生產(chǎn)者,可以提供一個(gè)T對象勺馆。

Consumer<T>,主要方法:void accept(T),這是一個(gè)消費(fèi)者戏售,默認(rèn)方法:andthen(),稍后執(zhí)行草穆。

Predicate<T>,主要方法:boolean test(T t),這是一個(gè)判斷者灌灾,接受一個(gè)輸入?yún)?shù) T,返回一個(gè)布爾值結(jié)果悲柱。默認(rèn)方法:and():且锋喜,or():或,negate():非豌鸡。

Function<T,R>,主要方法:R apply(T t),這是一個(gè)修改者嘿般,默認(rèn)方法:compose():優(yōu)先執(zhí)行,andThen(),稍后執(zhí)行直颅,identity():直接傳自身博个。

圖片發(fā)自簡書App

圖片發(fā)自簡書App
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市功偿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌往堡,老刑警劉巖械荷,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虑灰,居然都是意外死亡吨瞎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門穆咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤诀,“玉大人呻征,你說我怎么就攤上這事温亲。” “怎么了变泄?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵拍柒,是天一觀的道長心傀。 經(jīng)常有香客問我,道長拆讯,這世上最難降的妖魔是什么脂男? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任养叛,我火速辦了婚禮,結(jié)果婚禮上宰翅,老公的妹妹穿的比我還像新娘弃甥。我一直安慰自己,他們只是感情好汁讼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布潘飘。 她就那樣靜靜地躺著,像睡著了一般掉缺。 火紅的嫁衣襯著肌膚如雪卜录。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天眶明,我揣著相機(jī)與錄音艰毒,去河邊找鬼。 笑死搜囱,一個(gè)胖子當(dāng)著我的面吹牛丑瞧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蜀肘,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼绊汹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扮宠?” 一聲冷哼從身側(cè)響起西乖,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坛增,沒想到半個(gè)月后获雕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡收捣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年届案,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罢艾。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡楣颠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咐蚯,到底是詐尸還是另有隱情童漩,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布仓蛆,位于F島的核電站睁冬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豆拨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一直奋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧施禾,春花似錦脚线、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至攀例,卻和暖如春船逮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粤铭。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工挖胃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人梆惯。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓酱鸭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垛吗。 傳聞我的和親對象是個(gè)殘疾皇子凹髓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • 你要知道的Java8 匿名內(nèi)部類、函數(shù)式接口怯屉、lambda表達(dá)式與Stream API都在這里 轉(zhuǎn)載請注明出處 h...
    WWWWDotPNG閱讀 4,890評論 2 15
  • 本文內(nèi)容大部分來自《Java 8實(shí)戰(zhàn)》一書 前言 在上一篇文章中蔚舀,我們了解了利用行為參數(shù)化來傳遞代碼有助于應(yīng)對不斷...
    我沒有三顆心臟閱讀 5,059評論 0 3
  • 參考文章地址 前言 在上一篇文章中,我們了解了利用行為參數(shù)化來傳遞代碼有助于應(yīng)對不斷變化的需求蚀之,它允許你定義一個(gè)代...
    流年劃破容顏_cc55閱讀 255評論 0 0
  • 1.使用條件 lambda 表達(dá)式必須滿足以下條件才算是合法的Java代碼: ? lambda 表達(dá)式必須出現(xiàn)在期...
    July_lt閱讀 1,424評論 0 2
  • 久違的晴天蝗敢,家長會。 家長大會開好到教室時(shí)足删,離放學(xué)已經(jīng)沒多少時(shí)間了。班主任說已經(jīng)安排了三個(gè)家長分享經(jīng)驗(yàn)锁右。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,513評論 16 22