您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何理解Java中的lambda表達(dá)式的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇如何理解Java中的lambda表達(dá)式文章都會有所收獲,下面我們一起來看看吧。
Lambda表達(dá)式是JDK8開始后的一種新語法形式
作用:簡化匿名內(nèi)部類的代碼寫法
格式:
(匿名內(nèi)部類被重寫方法的形參列表)->{ 被重寫方法的方法體代碼 } 注:->是語法形式,無實(shí)際意義
首先我們先定義一個抽象類,通過匿名內(nèi)部類重寫其方法,再對其進(jìn)行簡化,比較二者之間有何變化:
使用Lambda表達(dá)式之前:
public static void main (String[] args){ People p = new People(){ @Override public void run(){ System.out.println("小學(xué)生跑的很慢"); } }; p.run(); } abstract class People{ public abstract void run(); }使用Lambda表達(dá)式之后:
People p = ()->{ System.out.println("小學(xué)生跑的很慢"); }; //會出現(xiàn)報(bào)錯會出現(xiàn)報(bào)錯,這是為什么呢?原因在于前面對于Lambda表達(dá)式的定義并不清晰,Lambda表達(dá)式并不能簡化所有匿名內(nèi)部類,其只能簡化函數(shù)式接口匿名內(nèi)部類的寫法形式,且接口中有且僅有一個抽象方法,通常,我們會再接口上加上一個@Functionalinterface注解,標(biāo)記該接口必須是滿足函數(shù)式接口。
真正意義上通過Lambda表達(dá)式簡化:
@FunctionalInterface//加上這個注解必須是函數(shù)式接口,且只有一個抽象方法 interface People{ void run(); } //簡化之前的匿名內(nèi)部類 People p = new People(){ @Override public void run(){ System.out.println("小學(xué)生跑的很慢!"); } }; //簡化之后 People p = () -> { System.out.println("小學(xué)生跑的很慢!"); };另外,也可以將其作為參數(shù)代入方法中去使用:
//在原來的基礎(chǔ)上定義一個pk方法 public static void pk(People p){ System.out.println("跑步情況如何:") p.run(); } //不使用Lambda的情況下: pk(p);//需要在定義匿名內(nèi)部類之后,將p代入; //使用Lambda的情況: People p = () -> { System.out.println("小學(xué)生跑的很慢!"); }; pk(() -> { System.out.println("小學(xué)生跑的很慢!"); }); //由于等號右邊即是People創(chuàng)建的對象p,因此可以可以直接將其代入
Lambda的好處:
Lambda是一個匿名函數(shù),我們可以把Lambda表達(dá)式理解為是一段可以傳遞的代碼,它可以寫出更簡潔、更靈活的代碼,作為一種更緊湊的代碼風(fēng)格,使Java語言表達(dá)能力得到了提升。
在之前的學(xué)習(xí)過程中,我們學(xué)習(xí)過了Arrays的相關(guān)知識,其中有一個sort方法(可以將數(shù)組升序或降序排列),它其實(shí)也是接口類,并且只有一個抽象方法:
//精簡之前: Arrays.sort(grade,new Comparator<Integer>(){ @Override public int compare(Integer o1,Integer o2){ return o2 -o1; } }); //精簡之后: Arrays.sort(grade,(Integer o1,Integer o2) -> { return o2 -o1; });
參數(shù)類型可以省略不寫
//參考前面的實(shí)戰(zhàn)例子 Arrays.sort(grade,(Integer o1,Integer o2) -> { return o2 -o1; }); //省略參數(shù)類型之后 Arrays.sort(grade,( o1, o2){ return o2 -o1; });
如果只有一個參數(shù),參數(shù)類型可以省略,同時()也可以省略
//簡單引用一個單個參數(shù)的例子,不需要了解其具體含義 btn.addActionListener((ActionEvent e) -> { System.out.println("我是簡單的例子。"); }); //簡化之后: btn.addActionListener( e -> { System.out.println("我是簡單的例子。"); });
如果Lambda表達(dá)式的方法體代碼只有一行代碼。可以省略大括號不寫,同時要省略分號
//參照上一條規(guī)則的例子 btn.addActionListener( e -> { System.out.println("我是簡單的例子。"); }); //簡化之后: btn.addActionListener( e -> System.out.println("我是簡單的例子。") );
如果Lambda表達(dá)式的方法體代碼只有一行代碼??梢允÷源罄ㄌ柌粚?。此時,如果這行代碼是return語句,必須省略return不寫,同時也必須省略";"不寫
//參照第一條規(guī)則的代碼 Arrays.sort(grade,(Integer o1,Integer o2) -> { return o2 -o1; }); //簡化之后: Arrays.sort(grade,( o1, o2)-> o2 -o1);
關(guān)于“如何理解Java中的lambda表達(dá)式”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“如何理解Java中的lambda表達(dá)式”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。