讀書(shū)筆記,資料來(lái)自Java8 實(shí)戰(zhàn)
我覺(jué)的它是匿名內(nèi)部類的優(yōu)化,省略了匿名內(nèi)部類許多不必要的代碼。而更簡(jiǎn)潔的表達(dá)匿名內(nèi)部類的參數(shù)所要實(shí)現(xiàn)的功能。它基本上就是沒(méi)有聲明名稱的方法,但和匿名類一樣,它也可以作為參 數(shù)傳遞給一個(gè)方法(傳遞參數(shù)的行為)
一、使用場(chǎng)景
在函數(shù)式接口上使用Lambda表達(dá)式
二、語(yǔ)法特點(diǎn)
1.簡(jiǎn)潔:無(wú)需像匿名內(nèi)部類那樣寫(xiě)許多模板代碼
2.傳遞:可以作為參數(shù)傳遞
3.語(yǔ)法:它不是一種特定的函數(shù),只是一種特定的寫(xiě)法和條件所組成的函數(shù)。
三、語(yǔ)法結(jié)構(gòu)
參數(shù)列表:原來(lái)匿名內(nèi)部類中的參數(shù)
箭頭:指向參數(shù)要做的事情
主體:接口方法中具體的實(shí)現(xiàn),因?yàn)長(zhǎng)ambda表達(dá)式只能作用在函數(shù)式接口上,主體對(duì)應(yīng)的就是接口方法具體的功能
四、使用Lambda表達(dá)式步驟
1.定義函數(shù)式的接口實(shí)現(xiàn)功能,即將方法的部分行為使用接口的形式參數(shù)化
2.將方法的參數(shù)設(shè)定位定義好的接口
3.使用Lambda表達(dá)式為接口方法傳遞具體的功能實(shí)現(xiàn)
Lambda和內(nèi)部類的對(duì)比
1.使用內(nèi)部類的方式傳遞實(shí)現(xiàn),無(wú)疑功能會(huì)被寫(xiě)死
2.而使用Lambda表示的方式傳遞實(shí)現(xiàn),可以動(dòng)態(tài)的為process(String name)方法傳遞它的實(shí)現(xiàn)。
對(duì)比語(yǔ)法結(jié)構(gòu):(name)表示需要傳遞實(shí)現(xiàn)的方法的參數(shù)列表,箭頭指向,該方法具體的實(shí)現(xiàn)。
五、使用Java8提供函數(shù)描述符
1.接口抽象方法的名字,可以表述Lambda表達(dá)式主體所要實(shí)現(xiàn)的功能的含義。因此想要表述一些功能就需要定義函數(shù)式接口,Java8提供了幾個(gè)函數(shù)式接口,省的我們自己定義接口。
例如OnPorcess接口的process方法的名稱描述了name+“ Hello“ 索要表達(dá)的含義
**1.Predicate Interface **
做條件判斷時(shí)可以使用
public interface Predicate<T>{
boolean test(T t);
}
2.Consumer Interface
沒(méi)有返回值,只需要實(shí)現(xiàn)具體的功能時(shí)可以使用。
@FunctionalInterface
public interface Consumer<T>{
void accept(T t);
}
3.Function Interface
有泛型返回值的方法,將一種輸入類型轉(zhuǎn)換成類一種類型輸出
@FunctionalInterface
public interface Function<T, R>{
R apply(T t);
}
使用上述三個(gè)接口
傳入Lambda表達(dá)式
**五、如何處理異常
任何Java提供的函數(shù)式接口都不能處理異常,如何想要處理異常需要自己定義函數(shù)式接口,并拋出異常,或者在執(zhí)行方法時(shí)try-catch住。