What?Java这么神奇的lambda表达式
目錄:
1.面向對象的思想和函數式編程思想的概述
2.解決冗余的Runnable代碼問題
3.Lambda標準格式及使用
4.對于Lambda表達式例子的解釋
1.面向對象的思想和函數式編程思想的概述
面向對象的思想:找一個能解決事情的對象,然后靠調用對象的方法解決事情
函數式編程的思想:只要能獲取到結果,誰做的怎么做的都不重要,只重視結果不重視過程
2.解決冗余的Runnable代碼問題
1.冗余的Runnable代碼問題
用Runnable創建多線程的例子:
正常情況下我們都會用上面代碼的格式來使用Runnable接口,但是有的時候我們還可以用匿名內部類的形式來代替上邊的代碼:
對java內部類不是很了解的兄弟過來補補課
java內部類詳解
總結上邊的兩個例子我們可以總結以下幾點:
1.Thread 類需要 Runnable 接口作為參數,其中的抽象 run 方法是用來指定線程任務內容的核心;
2.為了指定 run 的方法體,不得不需要 Runnable 接口的實現類;
3.為了省去定義一個 RunnableImpl 實現類的麻煩,不得不使用匿名內部類;
4.必須覆蓋重寫抽象 run 方法,所以方法名稱、方法參數、方法返回值不得不再寫一遍,且不能寫錯;
5.而實際上,只有方法體才是關鍵所在。
2.對于以上的問題我們真的希望創建一個匿名內部類對象嗎?不。我們只是為了做這件事情而不得不創建一個對象。我們真正希望做 的事情是:將 run 方法體內的代碼傳遞給 Thread 類知曉。,lambda表達式給了我們更加簡答的方式來run方法體內的代碼傳遞給Thread知曉
我們先來感受以下lambda表達式的魅力,就以上代碼我們使用Lambda表達式寫試試:
package untl1; public class MyLambda {public static void main(String[] args) {new Thread(()->System.out.println("我創建了一個多線程")).start();} }我當時看到這么寫的時候我心里在想
臥槽這是個什么**玩意
別急,咱一步一步來
3.Lambda標準格式及使用
1.Lambda表達式的使用前提:
1.使用Lambda必須具有接口,且要求接口中有且僅有一個抽象方法
2.使用Lambda必須具有上下文推斷。 也就是方法的參數或局部變量類型必須為Lambda對應的接口類型,才能使用Lambda作為該接口的實例。
2.Lambda的標準格式:
格式由三個部分組成:
1.一些參數
2.一個箭頭
3.一段代碼
標準格式:
(參數類型 參數名稱) ‐> { 代碼語句 }
對格式的解釋說明:
小括號:接口中抽象方法的參數列表,沒有參數就空著,有參數就寫出參數,多個參數用逗號分隔開
箭頭:傳遞的意思,把參數傳遞給方法體
大括號:重寫接口的抽象方法的方法體
3.在Lambda標準格式的基礎上,使用省略寫法的規則為:
1.小括號內參數的類型可以省略(這就是方法的參數是Lambda對應的接口類型的意義);
2.如果小括號內有且僅有一個參數,則小括號可以省略;
3. 如果大括號內有且僅有一個語句,則無論是否有返回值,都可以省略大括號、return關鍵字及語句分號這里注意要省略三者要必須一起省略
4.對于省略寫法的舉例:
(1)對于無參數無返回值的就可以按照上邊冗余的Runnable代碼來看
(2)對于有一個參數,一個語句是return語句
比如我們寫一個一個參數加上100并打印返回值的例子:
我們不用Lambda表達式可以這么寫:
那么用Lambda表達式就如下:
package untl1; public class MyLambda {public static void main(String[] args) {A(10, m->m+ 100);}public static void A(int b,Add a){System.out.println(a.add(b));} } interface Add{abstract int add(int a); } 運行結果: 110如果運算兩個參數的和并且輸出結果:
正常寫法:
使用Lambda表達式:
package untl1; public class MyLambda {public static void main(String[] args) {int m=3;int n=4;A(m, n, (x,y)->{return x+y;});}public static void A(int a,int b,Add c){System.out.println(c.add(a,b));} } interface Add{abstract int add(int a,int b); }4. 對于Lambda表達式例子的解釋
拿這個例子來說
package untl1; public class MyLambda {public static void main(String[] args) {int m=3;int n=4;A(m, n, (x,y)->{return x+y;});}public static void A(int a,int b,Add c){System.out.println(c.add(a,b));} } interface Add{abstract int add(int a,int b); }注意Lambda的格式,由于有兩個參數所以不能省略大括號分號和參數的小括號,但是參數類型還是可以省略的,這里可能會有疑問的x,y是哪里來的臥槽連一個參數類型都沒有,來來來拖出去亂棍打死,由于我們強大的Lambda所以我們的變量類型不用說明編譯器自動匹配,然后這里的x,y所代表的值在A函數體的內部就會被當作m,n,因為x,y代表a和b而且m,n也代表a和b,所以x,y就代表m,n
總結
以上是生活随笔為你收集整理的What?Java这么神奇的lambda表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给我十分钟带你过完java多线程所有基础
- 下一篇: Java函数式接口看这一篇就够了