成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

認(rèn)識(shí)JDK8新特性之Lambda表達(dá)式

awesome23 / 2169人閱讀

摘要:說(shuō)來(lái)挺慚愧的,已經(jīng)出來(lái)這么多年,在實(shí)際項(xiàng)目中卻很少真正使用表達(dá)式。舉個(gè)簡(jiǎn)單例子對(duì)于無(wú)參無(wú)返回值,可以有如下寫法前的一對(duì)小括號(hào)和后面的一對(duì)大括號(hào)都不能去掉。表達(dá)式不會(huì)定義新的作用域表達(dá)式的作用域與封閉作用域相同。

說(shuō)來(lái)挺慚愧的,JDK8已經(jīng)出來(lái)這么多年,在實(shí)際項(xiàng)目中卻很少真正使用Lambda表達(dá)式。其實(shí)工作中的項(xiàng)目很早就從開(kāi)發(fā)、測(cè)試、生產(chǎn),全面使用JDK8+Tomcat8了。

所以看來(lái)是時(shí)候要重新認(rèn)識(shí)下這個(gè)奇怪的東西。

沒(méi)錯(cuò),當(dāng)?shù)谝淮慰吹絃ambda表達(dá)式時(shí),我就認(rèn)為這是個(gè)奇怪的東西,->寫法讓我感覺(jué)這是在寫其它語(yǔ)言,說(shuō)好的一切皆對(duì)象呢?

表達(dá)式語(yǔ)法

這是Lambda表達(dá)式的基本語(yǔ)法:

(Type1 param1, Type2 param2, ..., TypeN paramN) -> {
    statment1;
    statment2;
    //......
    return statmentM;
}

參數(shù)列表是一個(gè)逗號(hào)分隔的形式參數(shù)列表,這些參數(shù)與功能接口中單一方法的形式參數(shù)相對(duì)應(yīng)。指定參數(shù)類型是可選項(xiàng);如果未指定參數(shù)類型,將從上下文推斷。參數(shù)列表必須用括號(hào)括起來(lái),但當(dāng)指定的單一參數(shù)不帶參數(shù)類型時(shí)除外;指定單一形式參數(shù)時(shí)可以不帶括號(hào)。如果功能接口方法不指定任何形式參數(shù),則必須指定空括號(hào)。

語(yǔ)句塊必須包含在大括號(hào)內(nèi),除非語(yǔ)句塊是一個(gè)方法調(diào)用語(yǔ)句。

舉個(gè)簡(jiǎn)單例子

對(duì)于無(wú)參無(wú)返回值,可以有如下寫法:

public interface TestIntf {
    public void sayHello();
}

// -> 前的一對(duì)小括號(hào)和后面的一對(duì)大括號(hào)都不能去掉。
TestIntf intf = () -> {System.out.println("HelloWorld!!!");};
intf.sayHello();

對(duì)于有參有返回值,可以有如下寫法:

public interface TestIntf {
    public String sayHello(String word);
}

// 完整寫法
TestIntf intf = (String word) -> {return "Hello " + word;};

// 參數(shù)word的類型可以推斷時(shí),可以去掉類型定義:
TestIntf intf = (word) -> {return "Hello " + word;};

// 甚至當(dāng)參數(shù)只有一個(gè)時(shí),可以去掉左邊的小括號(hào):
TestIntf intf = word -> {return "Hello " + word;};

// 右側(cè)的方法體只有一個(gè)表達(dá)式時(shí),可以去掉大括號(hào),甚至連return都可以不要:
TestIntf intf = word -> "Hello " + word;
變量作用域

Lambda表達(dá)式內(nèi)部可以訪問(wèn)外部的變量,但需要注意:

局部變量無(wú)論是在Lambda表達(dá)式主體中聲明,還是在封閉作用域中聲明,使用之前都必須先初始化。如:

interface TestIntf {
    public String sayHello(String word);
}

public class App {
    public static void main(String[] args) {
        String str;
        TestIntf intf = (String word) -> {
            System.out.println(str); // 編譯失敗,提示str變量未被初始化。
            return "Hello " + word;
        };
    }
}

Lambda表達(dá)式不會(huì)定義新的作用域;Lambda表達(dá)式的作用域與封閉作用域相同。如:

interface TestIntf {
    public String sayHello(String word);
}

public class App {
    public static void main(String[] args) {
        String str = "word";
        TestIntf intf = (String word) -> {
            String str = ""; // 編譯失敗,提示str變量重復(fù)定義了。
            return "Hello " + word;
        };
    }
}

而且也不能修改外部變量:

interface TestIntf {
    public String sayHello(String word);
}

public class App {
    public static void main(String[] args) {
        String str = "word";
        TestIntf intf = (String word) -> {
            str = "word!!!"; // 編譯報(bào)錯(cuò):Local variable str defined in an enclosing scope must be final or effectively final
            return "Hello " + word;
        };
    }
}

當(dāng)然,引用變量是可以通過(guò)內(nèi)部方法達(dá)到數(shù)據(jù)修改的。

interface TestIntf {
    public String sayHello(StringBuilder word);
}

public class App {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder("word");
        TestIntf intf = (StringBuilder word) -> {
            word.append("!!!");
            return "Hello " + word;
        };
        System.out.println(intf.sayHello(str)); // Hello word!!!
        System.out.println(str); // word!!!
    }
}
Lambda表達(dá)式中的this

在Lambda表達(dá)式中this引用的不是Lambda表達(dá)式對(duì)象,而是聲明它的外部對(duì)象:

interface TestIntf {
    public String sayHello();
}

public class App {
    
    public void test() {
        TestIntf intf = () -> "Hello " + this.getClass().getSimpleName();
        System.out.println(intf.sayHello());
    }
    
    public static void main(String[] args) {
        App app = new App();
        app.test(); // Hello App
    }
}
參考文章

https://www.oracle.com/techne...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75025.html

相關(guān)文章

  • JDK8特性Lambda達(dá)式體驗(yàn)

    摘要:的一個(gè)大亮點(diǎn)是引入表達(dá)式,使用它設(shè)計(jì)的代碼會(huì)更加簡(jiǎn)潔。簡(jiǎn)介表達(dá)式的語(yǔ)法由參數(shù)列表箭頭符號(hào)和函數(shù)體組成。表達(dá)式示例下面就用一些例子來(lái)體驗(yàn)一下表達(dá)式。類優(yōu)惠政策滿足的條件,返回接收訂單對(duì)象,對(duì)訂單對(duì)象進(jìn)行處理其中接收對(duì)象并返回。 Lambda 表達(dá)式(lambda expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象(lambda...

    curlyCheng 評(píng)論0 收藏0
  • 【全棧路】JAVA基礎(chǔ)課程十一_JDK8十大特性(20190706v1.2)

    摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對(duì)一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),不管是剛接觸開(kāi)發(fā)菜鳥(niǎo)還是業(yè)界資深人士,都希望對(duì)廣大同行帶來(lái)一些幫助。語(yǔ)法是,或者更一般的,要求構(gòu)造器方法是沒(méi)有參數(shù)靜態(tài)方法引用。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),...

    lcodecorex 評(píng)論0 收藏0
  • 【全棧路】JAVA基礎(chǔ)課程十一_JDK8十大特性(20190706v1.2)

    摘要:歡迎進(jìn)入基礎(chǔ)課程博客地址本系列文章將主要針對(duì)一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),不管是剛接觸開(kāi)發(fā)菜鳥(niǎo)還是業(yè)界資深人士,都希望對(duì)廣大同行帶來(lái)一些幫助。語(yǔ)法是,或者更一般的,要求構(gòu)造器方法是沒(méi)有參數(shù)靜態(tài)方法引用。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解,為平時(shí)歸納所總結(jié),...

    VPointer 評(píng)論0 收藏0
  • 樂(lè)字節(jié)-Java8特性-Lambda達(dá)式

    摘要:很多語(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è)方法,或者把代碼...

    gggggggbong 評(píng)論0 收藏0
  • 轉(zhuǎn) | Java8初體驗(yàn)(一)lambda達(dá)式語(yǔ)法

    摘要:初體驗(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ò)誤和理解偏...

    Lucky_Boy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<