Lambda用在哪里?幾種場(chǎng)景?
目錄
- 前言
- Lambda表達(dá)式語法
- 案例
- 幾種場(chǎng)景
- 口訣
- 函數(shù)式接口
- Lambda用在哪里
- 總結(jié)
Lambda表達(dá)式語法
Lambda的語法極為簡(jiǎn)單,類似如下結(jié)構(gòu):
- (parameters) -> expression
或
- (parameters) -> { statements; }
Lambda表達(dá)式由三部分組成:
1、paramaters:類似方法中的形參列表,這里的參數(shù)是函數(shù)式接口里的參數(shù)。這里的參數(shù)類型可以明確的聲明也可不聲明而由JVM隱含的推斷,另外當(dāng)只有一個(gè)推斷類型時(shí)可以省略掉圓括號(hào)。
2、->:可理解為“被用于”的意思
3、方法體:可以是表達(dá)式也可以代碼塊,是函數(shù)式接口里方法的實(shí)現(xiàn)。代碼塊可返回一個(gè)值或者什么都不返回,這里的代碼塊塊等同于方法的方法體。如果是表達(dá)式,也可以返回一個(gè)值或者什么都不反回。
案例
Lambda表達(dá)式本質(zhì)上是一個(gè)匿名方法,如
- public int add(int x,int y){
- return x + y;
- }
用Lambda表達(dá)式可以寫成
- (int x,int y) -> {return x + y;}
左側(cè)即是函數(shù)方法的參數(shù),右側(cè)就是實(shí)現(xiàn)主體。
可以更簡(jiǎn)潔一點(diǎn),就是參數(shù)類型可以不寫,java會(huì)根據(jù)上下文推斷出來
- (x, y) -> {return x + y;}
如果實(shí)現(xiàn)主體為一條語句,return也可以省掉,花括號(hào)也省掉。
- (x, y) -> x + y;
幾種場(chǎng)景
接口的抽象方法有幾種場(chǎng)景,我們來看一下
1、無參數(shù)、無返回值
- public void print(){
- System.out.println("Hello Lambda!");
- }
Lambda表達(dá)式寫法
- () -> System.out.println("Hello Lambda!");
典型就是Runnable中的run方法
- public interface Runnable {
- public abstract void run();
- }
之前的寫法
Lambda的寫法
- Runnable r1 = () -> System.out.println("Hello Lambda!");
- r1.run();
2、1個(gè)參數(shù),無返回值
- public void print(String str){
- System.out.println("Hello " + str);
- }
Lambda的寫法
- (str) -> System.out.println("Hello " + str);
如果是1個(gè)參數(shù),可以去掉小括號(hào)
- str -> System.out.println("Hello " + str);
3、多個(gè)參數(shù)、有返回值,且多條語句
- public int add(int x,int y){
- System.out.println("執(zhí)行加法運(yùn)算!");
- return x+y;
- }
Lambda的寫法
- (x,y) -> {
- System.out.println("執(zhí)行加法運(yùn)算!");
- return x+y;
- }
此處因?yàn)槭嵌鄺l語句,所以一定要用花括號(hào)。
4、多個(gè)參數(shù),有返回值,且一條語句,省掉花括號(hào)以及return
- public int add(int x,int y){
- return x + y;
- }
用Lambda表達(dá)式可以寫成
- (x, y) -> x + y;
口訣
上聯(lián): 左右遇一括號(hào)省
左側(cè)是1個(gè)參數(shù),可以省掉括號(hào);右側(cè)是一條語句可以省掉花括號(hào)
下聯(lián):左側(cè)推斷類型省
左側(cè)的參數(shù)類型可以省掉,有JAVA根據(jù)上下文推斷
橫批:能省則省
能夠省掉盡量省掉,使得代碼簡(jiǎn)潔
函數(shù)式接口
我們來看看什么是函數(shù)式接口:
若接口中只有一個(gè)抽象方法的接口稱為函數(shù)式接口
可以使用注解@FunctionlInterface來標(biāo)識(shí),可以檢查是否是函數(shù)式接口
我們來定義一個(gè)運(yùn)算接口
- @FunctionalInterface //函數(shù)式接口聲明
- public interface MyFunction {
- public Integer getValue(Integer num);
- }
注意必須只有一個(gè)抽象方法需要實(shí)現(xiàn)
通用函數(shù)實(shí)現(xiàn)
- public Integer operation(Integer num,MyFunction mf){
- return mf.getValue(num);
- }
測(cè)試
Lambda用在哪里
其實(shí)上面的就知道lambda用在哪的,就是配合函數(shù)式接口使用的。lambda表達(dá)式必須和函數(shù)式接口的抽象函數(shù)描述一樣的參數(shù)類型,它的返回類型也必須和抽象函數(shù)的返回類型兼容,并且他能拋出的異常也僅限于在函數(shù)的描述范圍中。
自定義一個(gè)函數(shù)接口,F(xiàn)為參數(shù),T為返回值
- @FunctionalInterface
- interface Converter<F, T>{
- T convert(F from);
- }
傳統(tǒng)匿名類方式
一定要觀察好上面的參數(shù)類型和返回類型,因?yàn)槎x的時(shí)候采用的是范型。
Lambda表達(dá)式方式
上面的兩種實(shí)現(xiàn)都是等價(jià)的。我們?cè)趤砜纯闯S玫木€程例子
感覺代碼還是比較多,用Lambda來寫
new Thread(() -> System.out.println("hello lambda")).start();
非常簡(jiǎn)潔是吧。這個(gè)就是Lambda的優(yōu)美的體現(xiàn)
總結(jié)
看到這里小伙伴們是不是感覺Lambda表達(dá)式的好處了,當(dāng)然我們要經(jīng)常寫,才能熟練掌握。lambda還有一些高級(jí)用法,老顧下次再繼續(xù)跟小伙伴們介紹。