本節(jié)作者主要是介紹了lambda 的來(lái)歷、優(yōu)勢(shì)以及使用時(shí)的一些注意事項(xiàng)。
來(lái)歷:
在java8之前,創(chuàng)建函數(shù)對(duì)象都是通過(guò)匿名類(lèi)。但是匿名類(lèi)的代碼太過(guò)繁瑣,從編寫(xiě)和可讀性上都不便于推廣。于是在java8中引入了lambda 表達(dá)式來(lái)實(shí)現(xiàn)函數(shù)式接口(帶有單個(gè)抽象方法的接口)。優(yōu)勢(shì)
可見(jiàn)lambda 表達(dá)式就是為了解決匿名類(lèi)不抑郁編寫(xiě)和可讀性差的問(wèn)題引入的。使用lambda 表達(dá)式可以簡(jiǎn)化再創(chuàng)建函數(shù)式接口時(shí)的代碼。lambda表達(dá)式可以省略參數(shù)和返回值的類(lèi)型,因?yàn)榫幾g器會(huì)通過(guò)類(lèi)型推斷 推導(dǎo)出來(lái)。(不能推導(dǎo)出來(lái)的時(shí)候需要指明)
因此在java8之后,lambda 就成了表示小函數(shù)對(duì)象的最佳方式。-
注意事項(xiàng)
- 由于lambda是沒(méi)有名字和文檔的,如果一個(gè)計(jì)算不是自解釋的,或是行數(shù)較多(對(duì)于lambda來(lái)說(shuō)一行最好,三行最多),就不要放在lambda中了,推薦重構(gòu)為新的方法。
- 在枚舉類(lèi)中使用時(shí):通過(guò)enum構(gòu)造傳入的參數(shù)是在靜態(tài)環(huán)境的,所以從enum構(gòu)造傳入的lambda不能訪(fǎng)問(wèn)枚舉的成員變量
- 雖然lambda 是匿名類(lèi)在創(chuàng)建簡(jiǎn)單函數(shù)式方法時(shí)的優(yōu)化,但是有些場(chǎng)景只能使用匿名類(lèi):
1、抽象類(lèi)或接口有多個(gè)需要覆蓋的方法
2、需要引用自身時(shí),lambda 無(wú)法獲得對(duì)自身的引用,this 指的還是外圍實(shí)例.
而匿名類(lèi)可以,匿名類(lèi)中的this 指的是匿名類(lèi)實(shí)例自身。
lambda表達(dá)式在實(shí)踐中使用的很多,用法基本也都了解。讀完這部分最大的收貨其實(shí)是回憶起了在一些特殊的場(chǎng)景下,還是只能使用匿名類(lèi)。