摘要:的表達(dá)式的一個(gè)大亮點(diǎn)是引入表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡(jiǎn)潔。表達(dá)式其實(shí)是一個(gè)匿名函數(shù)。匿名方法的寫法定義一個(gè)接口,接口的方法是判斷是否滿足的條件。
Java8的Lambda 表達(dá)式
Java 8的一個(gè)大亮點(diǎn)是引入Lambda表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡(jiǎn)潔。Lambda 表達(dá)式其實(shí)是一個(gè)匿名函數(shù)。
一、演變過(guò)程
1.普通方法的寫法
定義一個(gè)Hero對(duì)象,存儲(chǔ)英雄的屬性 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); } }
這種方式,如果篩選條件改變,需要重新再寫一個(gè)方法,稍微麻煩一點(diǎn)。
2.匿名方法的寫法
定義一個(gè)接口,接口的方法是判斷是否滿足的條件。
public interface IHeroChecker { /** * 判斷Hero是否滿足條件 * @param h * @return */ public boolean checker(Hero h); }
寫一個(gè)過(guò)濾方法,判斷條件是調(diào)用IHeroChecker對(duì)象的checker方法,其實(shí)就是這個(gè)方法中要使用另一個(gè)類的方法。
private static void filter(Listheros,IHeroChecker checker) { for (Hero hero : heros) { if(checker.checker(hero)) System.out.print(hero); } } //匿名類對(duì)實(shí)現(xiàn)此判斷方法 IHeroChecker checker = new IHeroChecker() { @Override public boolean checker(Hero h) { return (h.hp>100 && h.damage<50); } }; filter(heros,checker);
使用匿名類實(shí)現(xiàn)這個(gè)方法,再調(diào)用filter方法
3.Lambda 表達(dá)式的寫法
使用Lambda 表達(dá)式就不用寫匿名類了,將匿名類演變成Lambda表達(dá)式;
1.把匿名類外面的殼子去掉,只保留方法參數(shù)和方法體;
2.參數(shù)和方法體之間加上符號(hào) ->
3.把return和{}去掉
4.只有一個(gè)參數(shù)時(shí)可以去掉();
//匿名類對(duì)實(shí)現(xiàn)此判斷方法 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);
二、與匿名方法關(guān)系
與匿名類概念相比較,Lambda 其實(shí)就是匿名方法,這是一種把方法作為參數(shù)進(jìn)行傳遞的編程思想。java執(zhí)行時(shí),還是會(huì)將他變成匿名類的.
三、Lambda表達(dá)式弊端
1.可讀性差,匿名類代碼結(jié)構(gòu)比較起來(lái),Lambda表達(dá)式一旦變得比較長(zhǎng),不好理解; 2.不便于調(diào)試,很難在Lambda表達(dá)式中增加調(diào)試信息; 3.版本支持,在JDK8以后才有,之前的版本不支持。
四、Lambda表達(dá)式方法的引用
前面我們講了,Lambda表達(dá)式其實(shí)就是一個(gè)方法,把{}和return去掉了而已,那我們?nèi)绻鞋F(xiàn)成的方法,用已有的方法代替它該怎么做
1.引用靜態(tài)方法
已經(jīng)有了靜態(tài)方法
public static boolean checker(Hero h) { return h.hp>100 && h.damage<50; }
在Lambda表達(dá)式中使用
filter(heros, h -> LambdaTest.checker(h) );
直接引用
filter(heros, LambdaTest::checker);
2.引用對(duì)象的方法
引用LambdaTest對(duì)象中testHero方法
LambdaTest lambdaTest = new LambdaTest(); filter(heros, lambdaTest::testHero);
3.引用容器對(duì)象的方法
在Hero對(duì)象中有
private boolean matched(){ return (hp > 100 && damage < 50); }
在Lambda表達(dá)式中使用
filter(heros, h -> h.matched());
直接引用
filter(heros, Hero::matched);
五、總結(jié)
可以認(rèn)為L(zhǎng)ambda表達(dá)式可以看做是一個(gè)方法,我們把這個(gè)方法直接可以傳遞到另一個(gè)方法中。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77817.html
摘要:初體驗(yàn)下面進(jìn)入本文的正題表達(dá)式。接下來(lái)展示表達(dá)式和其好基友的配合。吐槽一下方法引用表面上看起來(lái)方法引用和構(gòu)造器引用進(jìn)一步簡(jiǎn)化了表達(dá)式的書(shū)寫,但是個(gè)人覺(jué)得這方面沒(méi)有的下劃線語(yǔ)法更加通用。 感謝同事【天錦】的投稿。投稿請(qǐng)聯(lián)系 [email protected] 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因?yàn)楸救艘彩莿倓傞_(kāi)始學(xué)習(xí)Java8,所以文中肯定有錯(cuò)誤和理解偏...
摘要:而在中,表達(dá)式是對(duì)象,它們必須依附于一類特別的對(duì)象類型函數(shù)式接口。即表達(dá)式返回的是函數(shù)式接口類型。 Java8被稱作Java史上變化最大的一個(gè)版本。其中包含很多重要的新特性,最核心的就是增加了Lambda表達(dá)式和Stream API。這兩者也可以結(jié)合在一起使用。首先來(lái)看下什么是Lambda表達(dá)式。Lambda表達(dá)式,維基百科上的解釋是一種用于表示匿名函數(shù)和閉包的運(yùn)算符,感覺(jué)看到這個(gè)解釋...
摘要:很多語(yǔ)言等從設(shè)計(jì)之初就支持表達(dá)式。注意此時(shí)外部局部變量將自動(dòng)變?yōu)樽鳛榉椒ǚ祷刂道臃祷嘏袛嘧址欠駷榭张袛嘧址欠駷榭战裉礻P(guān)于新特性表達(dá)式就講到這里了,接下來(lái)我會(huì)繼續(xù)講述新特性之函數(shù)式接口。 上一篇文章我們了解了Java8新特性-接口默認(rèn)方法,接下來(lái)我們聊一聊Java8新特性之Lambda表達(dá)式。 Lambda表達(dá)式(也稱為閉包),它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(dá)式改進(jìn)后或者是不得不承認(rèn),代碼看起來(lái)跟清晰了。這是由泛型接口內(nèi)部實(shí)現(xiàn)方式造成的。 # Lambda表達(dá)式在《Java8實(shí)戰(zhàn)》中第三章主要講的是Lambda表達(dá)式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來(lái)因?qū)Σ粩嘧兓男枨?,最后我們也使用到了Lambda,通過(guò)表達(dá)式為我們簡(jiǎn)化了很多代碼從而極大地提高了我們的...
摘要:使用表達(dá)式,使得應(yīng)用變得簡(jiǎn)潔而緊湊。很多語(yǔ)言等從設(shè)計(jì)之初就支持表達(dá)式。表達(dá)式的參數(shù)與函數(shù)式接口內(nèi)方法的參數(shù),返回值類型相互對(duì)應(yīng)。更多教程和資料請(qǐng)上騰訊課堂樂(lè)字節(jié) showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表達(dá)式,允許開(kāi)發(fā)者將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼本身當(dāng)作數(shù)據(jù)進(jìn)行處理。...
摘要:函數(shù)式編程說(shuō)前,先理解下什么是函數(shù)式編程,如果你是個(gè)純程序員,而且之前一直是沒(méi)有使用過(guò),可能還沒(méi)有使用過(guò)這種編程方式。表達(dá)式可以表示閉包注意和數(shù)學(xué)傳統(tǒng)意義上的不同。意思就是說(shuō),只要是接口類型,我們都可以傳入表達(dá)式。在包下定義了各種函數(shù)接口 函數(shù)式編程 說(shuō)lambdas前,先理解下什么是函數(shù)式編程,如果你是個(gè)純Java程序員,而且之前一直是沒(méi)有使用過(guò)Java8,可能還沒(méi)有使用過(guò)這種編程方...
閱讀 2044·2021-08-21 14:09
閱讀 509·2019-08-30 15:44
閱讀 2136·2019-08-29 16:32
閱讀 1394·2019-08-29 15:36
閱讀 3478·2019-08-29 12:43
閱讀 2804·2019-08-29 11:14
閱讀 452·2019-08-28 18:26
閱讀 2271·2019-08-26 13:57