摘要:的表達式的一個大亮點是引入表達式,使用它設計的代碼會更加簡潔。表達式其實是一個匿名函數。匿名方法的寫法定義一個接口,接口的方法是判斷是否滿足的條件。
Java8的Lambda 表達式
Java 8的一個大亮點是引入Lambda表達式,使用它設計的代碼會更加簡潔。Lambda 表達式其實是一個匿名函數。
一、演變過程
1.普通方法的寫法
定義一個Hero對象,存儲英雄的屬性 public class Hero implements Comparable{ /** * 英雄名 */ public String name; /** * 血量 */ public float hp; /** * 傷害 */ public int damage.......
篩選出,滿足下面條件的英雄類
private static void filter(Listheros) { for (Hero hero : heros) { if (hero.hp > 100 && hero.damage < 50) System.out.print(hero); } }
這種方式,如果篩選條件改變,需要重新再寫一個方法,稍微麻煩一點。
2.匿名方法的寫法
定義一個接口,接口的方法是判斷是否滿足的條件。
public interface IHeroChecker { /** * 判斷Hero是否滿足條件 * @param h * @return */ public boolean checker(Hero h); }
寫一個過濾方法,判斷條件是調用IHeroChecker對象的checker方法,其實就是這個方法中要使用另一個類的方法。
private static void filter(Listheros,IHeroChecker checker) { for (Hero hero : heros) { if(checker.checker(hero)) System.out.print(hero); } } //匿名類對實現此判斷方法 IHeroChecker checker = new IHeroChecker() { @Override public boolean checker(Hero h) { return (h.hp>100 && h.damage<50); } }; filter(heros,checker);
使用匿名類實現這個方法,再調用filter方法
3.Lambda 表達式的寫法
使用Lambda 表達式就不用寫匿名類了,將匿名類演變成Lambda表達式;
1.把匿名類外面的殼子去掉,只保留方法參數和方法體;
2.參數和方法體之間加上符號 ->
3.把return和{}去掉
4.只有一個參數時可以去掉();
//匿名類對實現此判斷方法 IHeroChecker checker = new IHeroChecker() { @Override public boolean checker(Hero h) { return (h.hp>100 && h.damage<50); } }; filter(heros,h->h.hp>100 && h.damage<50);
二、與匿名方法關系
與匿名類概念相比較,Lambda 其實就是匿名方法,這是一種把方法作為參數進行傳遞的編程思想。java執行時,還是會將他變成匿名類的.
三、Lambda表達式弊端
1.可讀性差,匿名類代碼結構比較起來,Lambda表達式一旦變得比較長,不好理解; 2.不便于調試,很難在Lambda表達式中增加調試信息; 3.版本支持,在JDK8以后才有,之前的版本不支持。
四、Lambda表達式方法的引用
前面我們講了,Lambda表達式其實就是一個方法,把{}和return去掉了而已,那我們如果有現成的方法,用已有的方法代替它該怎么做
1.引用靜態方法
已經有了靜態方法
public static boolean checker(Hero h) { return h.hp>100 && h.damage<50; }
在Lambda表達式中使用
filter(heros, h -> LambdaTest.checker(h) );
直接引用
filter(heros, LambdaTest::checker);
2.引用對象的方法
引用LambdaTest對象中testHero方法
LambdaTest lambdaTest = new LambdaTest(); filter(heros, lambdaTest::testHero);
3.引用容器對象的方法
在Hero對象中有
private boolean matched(){ return (hp > 100 && damage < 50); }
在Lambda表達式中使用
filter(heros, h -> h.matched());
直接引用
filter(heros, Hero::matched);
五、總結
可以認為Lambda表達式可以看做是一個方法,我們把這個方法直接可以傳遞到另一個方法中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77817.html
摘要:初體驗下面進入本文的正題表達式。接下來展示表達式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構造器引用進一步簡化了表達式的書寫,但是個人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯系 tengfei@ifeve.com 本文主要記錄自己學習Java8的歷程,方便大家一起探討和自己的備忘。因為本人也是剛剛開始學習Java8,所以文中肯定有錯誤和理解偏...
摘要:而在中,表達式是對象,它們必須依附于一類特別的對象類型函數式接口。即表達式返回的是函數式接口類型。 Java8被稱作Java史上變化最大的一個版本。其中包含很多重要的新特性,最核心的就是增加了Lambda表達式和Stream API。這兩者也可以結合在一起使用。首先來看下什么是Lambda表達式。Lambda表達式,維基百科上的解釋是一種用于表示匿名函數和閉包的運算符,感覺看到這個解釋...
摘要:很多語言等從設計之初就支持表達式。注意此時外部局部變量將自動變為作為方法返回值例子返回判斷字符串是否為空判斷字符串是否為空今天關于新特性表達式就講到這里了,接下來我會繼續講述新特性之函數式接口。 上一篇文章我們了解了Java8新特性-接口默認方法,接下來我們聊一聊Java8新特性之Lambda表達式。 Lambda表達式(也稱為閉包),它允許我們將函數當成參數傳遞給某個方法,或者把代碼...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達式改進后或者是不得不承認,代碼看起來跟清晰了。這是由泛型接口內部實現方式造成的。 # Lambda表達式在《Java8實戰》中第三章主要講的是Lambda表達式,在上一章節的筆記中我們利用了行為參數化來因對不斷變化的需求,最后我們也使用到了Lambda,通過表達式為我們簡化了很多代碼從而極大地提高了我們的...
摘要:使用表達式,使得應用變得簡潔而緊湊。很多語言等從設計之初就支持表達式。表達式的參數與函數式接口內方法的參數,返回值類型相互對應。更多教程和資料請上騰訊課堂樂字節 showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表達式,允許開發者將函數當成參數傳遞給某個方法,或者把代碼本身當作數據進行處理。...
摘要:函數式編程說前,先理解下什么是函數式編程,如果你是個純程序員,而且之前一直是沒有使用過,可能還沒有使用過這種編程方式。表達式可以表示閉包注意和數學傳統意義上的不同。意思就是說,只要是接口類型,我們都可以傳入表達式。在包下定義了各種函數接口 函數式編程 說lambdas前,先理解下什么是函數式編程,如果你是個純Java程序員,而且之前一直是沒有使用過Java8,可能還沒有使用過這種編程方...
閱讀 2014·2021-08-21 14:09
閱讀 481·2019-08-30 15:44
閱讀 2106·2019-08-29 16:32
閱讀 1370·2019-08-29 15:36
閱讀 3433·2019-08-29 12:43
閱讀 2776·2019-08-29 11:14
閱讀 429·2019-08-28 18:26
閱讀 2246·2019-08-26 13:57