ITEM 43: 與lambdas相比甲脏,應該盡量使用方法引用

ITEM 43: PREFER METHOD REFERENCES TO LAMBDAS
??lambdas相對于匿名類的主要優(yōu)勢是它們更簡潔。Java提供了一種生成函數(shù)對象的方法妹笆,甚至比lambdas 更簡潔块请,這就是方法引用。下面是一個程序的代碼片段晾浴,該程序維護從任意鍵到整數(shù)值的映射。如果該值被解釋為鍵的實例數(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方法最岗,該方法是在Java 8中添加到 Map 接口中的帕胆。如果給定鍵沒有映射,則該方法只是插入給定的值般渡;如果已經(jīng)存在映射懒豹,merge將給定的函數(shù)應用于當前值和給定的值,并使用結(jié)果覆蓋當前值驯用。這段代碼代表了合并方法的一個典型用例脸秽。代碼讀起來很好,但是仍然有一些樣板文件蝴乔。參數(shù)計數(shù)和incr沒有增加多少值记餐,并且它們占用了相當多的空間。實際上薇正,告訴你的只是函數(shù)返回它的兩個參數(shù)的和片酝。從Java 8開始囚衔,Integer(以及所有其他裝箱的數(shù)值原語類型)提供了一個靜態(tài)方法 sum,它做的是完全相同的事情雕沿。我們可以簡單地傳遞一個引用到這個方法练湿,并得到相同的結(jié)果與較少的視覺混亂:
map.merge(key, 1, Integer::sum);
??方法擁有的參數(shù)越多,您可以通過方法引用消除的樣板文件就越多晦炊。但是鞠鲜,在某些lambdas中,您選擇的參數(shù)名提供了有用的文檔断国,使得 lambda 比方法引用更具可讀性和可維護性贤姆,即使lambda更長。
??你不能對一個方法引用做任何你不能對 lambda 做的事情(除了一個模糊的例外——如果你好奇的話稳衬,可以看看JLS, 9.9-2)霞捡。也就是說,方法引用通常會產(chǎn)生更短薄疚、更清晰的代碼碧信。如果一個lambda 變得太長或太復雜,也許你應該這么做:你可以從lambda中提取代碼到一個新方法中街夭,并用對該方法的引用替換lambda砰碴。您可以為該方法起一個好名字,并將其文檔化為您的核心內(nèi)容板丽。
??如果您使用IDE進行編程呈枉,它將在任何可能的地方用方法引用替換 lambda。大多數(shù)情況下你應該接受 IDE 的提議埃碱。有時候猖辫,lambda 會比方法引用更簡潔。這種情況最常發(fā)生在方法與 lambda 在同一個類中砚殿。例如啃憎,考慮這個代碼片段,它被假定發(fā)生在一個名為GoshThisClassNameIsHumongous 的類中:
service.execute(GoshThisClassNameIsHumongous::action);
??用 lambda 實現(xiàn)看起來是這樣的:
service.execute(() -> action());
??使用方法引用的代碼段與使用 lambda 的代碼段相比既不短也不清楚似炎,因此最好使用后者辛萍。與此類似,F(xiàn)unction 接口提供了一個通用的靜態(tài)工廠方法來返回 identity 函數(shù) Function.identity()羡藐。它通常更短叹阔,更簡潔,不使用這個方法传睹,但代碼等價的 lambda 內(nèi)聯(lián): x -> x耳幢。
??許多方法引用是靜態(tài)方法,但是有四種方法不是靜態(tài)方法。其中兩個是綁定的和未綁定的實例方法引用睛藻。在綁定引用中启上,接收對象在方法引用中指定。綁定引用在本質(zhì)上與靜態(tài)引用相似:函數(shù)對象采用與引用方法相同的參數(shù)店印。在未綁定引用中冈在,在應用函數(shù)對象時,通過方法聲明參數(shù)之前的附加參數(shù)指定接收對象按摘。未綁定的引用通常用作流管道中的映射和篩選函數(shù)(item 45)包券。最后,類和數(shù)組有兩種構(gòu)造函數(shù)引用炫贤。構(gòu)造函數(shù)引用作為工廠對象溅固。5類方法參考文獻匯總?cè)缦卤?

方法引用類型.png

??總之,方法引用常常提供比 lambdas 更簡潔的替代方法兰珍。如果方法引用更短侍郭、更清晰,請使用它們掠河;如果沒有亮元,就用lambdas。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唠摹,一起剝皮案震驚了整個濱河市爆捞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勾拉,老刑警劉巖煮甥,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異望艺,居然都是意外死亡苛秕,警方通過查閱死者的電腦和手機肌访,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門找默,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吼驶,你說我怎么就攤上這事惩激。” “怎么了蟹演?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵风钻,是天一觀的道長。 經(jīng)常有香客問我酒请,道長骡技,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮布朦,結(jié)果婚禮上囤萤,老公的妹妹穿的比我還像新娘。我一直安慰自己是趴,他們只是感情好涛舍,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唆途,像睡著了一般富雅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肛搬,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天没佑,我揣著相機與錄音,去河邊找鬼滚婉。 笑死图筹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的让腹。 我是一名探鬼主播远剩,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骇窍!你這毒婦竟也來了瓜晤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤腹纳,失蹤者是張志新(化名)和其女友劉穎痢掠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘲恍,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡足画,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了佃牛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淹辞。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖俘侠,靈堂內(nèi)的尸體忽然破棺而出象缀,到底是詐尸還是另有隱情,我是刑警寧澤爷速,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布央星,位于F島的核電站,受9級特大地震影響惫东,放射性物質(zhì)發(fā)生泄漏莉给。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望颓遏。 院中可真熱鬧胁黑,春花似錦、人聲如沸州泊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽遥皂。三九已至力喷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間演训,已是汗流浹背弟孟。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留样悟,地道東北人拂募。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像窟她,于是被迫代替她去往敵國和親陈症。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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