Effective Java(3rd)-Item43 相比lambda,更傾向使用方法引用

??lambda比匿名類的首要優(yōu)勢是它們更簡潔憨降。Java提供了一個方式來生成函數(shù)式對象比lambda更簡潔“:方法引用。下面是一個程序的代碼片段该酗,該程序維護(hù)從任意鍵到整數(shù)值的映射授药。如果該值被解釋為鍵實(shí)例數(shù)的計(jì)數(shù),則該程序是一個多集實(shí)現(xiàn)呜魄。代碼段的功能是:如果數(shù)字1不在映射中悔叽,則將其與鍵關(guān)聯(lián);如果鍵已經(jīng)存在,則增加關(guān)聯(lián)值:
map.merge(key, 1, (count, incr) -> count + incr);
??注意到這個代碼使用merge方法爵嗅,在Java8中被添加到Map接口娇澎。如果給出的鍵沒有映射,方法僅僅會插入給予的值睹晒;如果已經(jīng)存在映射趟庄,merge將給定函數(shù)應(yīng)用于當(dāng)前值和給定值,并使用結(jié)果覆蓋當(dāng)前值伪很。這段代碼代表了merge方法的一個典型用例戚啥。
??代碼讀起來很好,但是仍然有一些樣板文件锉试。參數(shù)count和incr沒有增加多少值猫十,而且它們占用了相當(dāng)大的空間。實(shí)際上,lambda告訴你的只是函數(shù)返回它兩個參數(shù)的和拖云。從Java8開始贷笛,Integer(以及所有其他裝箱數(shù)值原生類型)提供了一個靜態(tài)方法sum,也是做了同樣的事情宙项。我們可以簡單地向這個方法傳遞一個引用并以更少的視覺混亂獲得相同的結(jié)果:
map.merge(key, 1, Integer::sum);
??方法的參數(shù)越多昨忆,您可以通過方法引用消除的樣板文件就越多。然而杉允,在一些lambda中邑贴,你選擇的參數(shù)名提供了有用的文檔,使得lambda比方法引用更具有可讀性叔磷,即使lambda更長拢驾。
??你不能對方法引用做任何你不能對lambda做的事情(有一個不太明顯的例外—如果您好奇,請參閱JLS, 9.9-2)改基。也就是說繁疤,方法引用經(jīng)常導(dǎo)致更短,更清晰的代碼秕狰。它們也能提供你一個輸出如果lambda太長或太復(fù)雜:你可以從lambda中提取代碼為一個新的方法并用方法引用替代lambda稠腊。您可以給該方法起一個好名字,并將其文檔化到您的核心內(nèi)容鸣哀。
??如果你使用IDE編程架忌,只要它可以,它會提供你用方法引用替代lambda的功能我衬。你應(yīng)該經(jīng)常叹放,但不要總要,接受IDE的建議挠羔。有時(shí)候井仰,lambda將比方法引用更簡潔。當(dāng)方法在同一個類中會經(jīng)常發(fā)生破加。比如俱恶,考慮這個片段,假設(shè)發(fā)生在一個名為GoshThisClassNameIsHumongous的類中:

service.execute(GoshThisClassNameIsHumongous::action);
??等價(jià)的lambda長這個樣子:
service.execute(() -> action());
??該片段使用方法引用并不比lambda更短或更清晰范舀,所以建議使用后者合是。類似的,F(xiàn)unction接口提供了一個泛型靜態(tài)工廠方法返回它本身的方法尿背,F(xiàn)unction.identity()端仰。很明顯不用這個方法會更短,相對的lambda是 x->x田藐。
??許多方法引用引用了靜態(tài)方法荔烧,但是有四種不是這樣的吱七。其中兩種是 boundbound實(shí)例方法引用。在綁定引用中鹤竭,接收對象在方法引用中指定踊餐。綁定引用在本質(zhì)上類似于靜態(tài)引用:函數(shù)對象接受與引用方法相同的參數(shù).在未綁定引用中,當(dāng)應(yīng)用函數(shù)對象時(shí)臀稚,通過方法聲明參數(shù)之前的附加參數(shù)指定接收對象.未綁定引用通常用作流管道中的映射和篩選函數(shù)( item45 ).最后吝岭,有兩種 構(gòu)造方法引用。為類和數(shù)組使用吧寺。構(gòu)造方法引用作為工廠對象窜管。五種方法參考文獻(xiàn)匯總?cè)缦卤?

image.png

??總之,方法引用通常提供比lambdas更簡潔的替代方法稚机。 當(dāng)方法引用比它們更短更清晰的時(shí)候幕帆,用它們;當(dāng)它們不是赖条,堅(jiān)持lambda失乾。

本文寫于2019.7.12,歷時(shí)1天

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纬乍,一起剝皮案震驚了整個濱河市碱茁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仿贬,老刑警劉巖纽竣,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诅蝶,居然都是意外死亡退个,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門调炬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舱馅,你說我怎么就攤上這事缰泡。” “怎么了代嗤?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵棘钞,是天一觀的道長。 經(jīng)常有香客問我干毅,道長宜猜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任硝逢,我火速辦了婚禮姨拥,結(jié)果婚禮上绅喉,老公的妹妹穿的比我還像新娘。我一直安慰自己叫乌,他們只是感情好柴罐,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憨奸,像睡著了一般革屠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上排宰,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天似芝,我揣著相機(jī)與錄音,去河邊找鬼板甘。 笑死党瓮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的虾啦。 我是一名探鬼主播麻诀,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傲醉!你這毒婦竟也來了蝇闭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤硬毕,失蹤者是張志新(化名)和其女友劉穎呻引,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吐咳,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逻悠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了韭脊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童谒。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沪羔,靈堂內(nèi)的尸體忽然破棺而出饥伊,到底是詐尸還是另有隱情,我是刑警寧澤蔫饰,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布琅豆,位于F島的核電站,受9級特大地震影響篓吁,放射性物質(zhì)發(fā)生泄漏茫因。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一杖剪、第九天 我趴在偏房一處隱蔽的房頂上張望冻押。 院中可真熱鬧驰贷,春花似錦、人聲如沸翼雀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狼渊。三九已至箱熬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狈邑,已是汗流浹背城须。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留米苹,地道東北人糕伐。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像蘸嘶,于是被迫代替她去往敵國和親良瞧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海帶_4bbc閱讀 768評論 1 2
  • 目錄: Android:Android 0.*Android 1.*Android 2.*Android 3.*A...
    敲代碼的令狐蔥閱讀 3,901評論 0 2
  • 今天是2016年11月22日 天氣預(yù)報(bào)說好的雨加雪沒有落下 外面的風(fēng)很肆虐 我圍著圍巾不太冷 要上三節(jié)課 第一節(jié)逛...
    陌旻閱讀 151評論 0 0
  • 七夕懷想 云中錦書 春去秋來 滄桑了歲月 月亮缺了又圓 歷經(jīng)苦辣酸甜 你依然給我時(shí)間 月光清淺 微風(fēng)纏綿 透過一瀑...
    夜書房閱讀 65評論 0 0
  • 你走了训唱, 沒回頭褥蚯, 沒轉(zhuǎn)身, 只留下那優(yōu)美的背影况增。 左看右看赞庶, 手提文件夾遮住頭頂, 穿過川流不息的車子澳骤, 眼睛沾...
    澤秦閱讀 317評論 6 12