亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

認識JDK8新特性之Lambda表達式

awesome23 / 2182人閱讀

摘要:說來挺慚愧的,已經(jīng)出來這么多年,在實際項目中卻很少真正使用表達式。舉個簡單例子對于無參無返回值,可以有如下寫法前的一對小括號和后面的一對大括號都不能去掉。表達式不會定義新的作用域表達式的作用域與封閉作用域相同。

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

所以看來是時候要重新認識下這個奇怪的東西。

沒錯,當(dāng)?shù)谝淮慰吹絃ambda表達式時,我就認為這是個奇怪的東西,->寫法讓我感覺這是在寫其它語言,說好的一切皆對象呢?

表達式語法

這是Lambda表達式的基本語法:

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

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

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

舉個簡單例子

對于無參無返回值,可以有如下寫法:

public interface TestIntf {
    public void sayHello();
}

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

對于有參有返回值,可以有如下寫法:

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

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

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

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

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

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

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

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表達式不會定義新的作用域;Lambda表達式的作用域與封閉作用域相同。如:

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!!!"; // 編譯報錯:Local variable str defined in an enclosing scope must be final or effectively final
            return "Hello " + word;
        };
    }
}

當(dāng)然,引用變量是可以通過內(nèi)部方法達到數(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表達式中的this

在Lambda表達式中this引用的不是Lambda表達式對象,而是聲明它的外部對象:

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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/75025.html

相關(guān)文章

  • JDK8特性Lambda達式體驗

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

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

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

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

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

    VPointer 評論0 收藏0
  • 樂字節(jié)-Java8特性-Lambda達式

    摘要:很多語言等從設(shè)計之初就支持表達式。注意此時外部局部變量將自動變?yōu)樽鳛榉椒ǚ祷刂道臃祷嘏袛嘧址欠駷榭张袛嘧址欠駷榭战裉礻P(guān)于新特性表達式就講到這里了,接下來我會繼續(xù)講述新特性之函數(shù)式接口。 上一篇文章我們了解了Java8新特性-接口默認方法,接下來我們聊一聊Java8新特性之Lambda表達式。 Lambda表達式(也稱為閉包),它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個方法,或者把代碼...

    gggggggbong 評論0 收藏0
  • 轉(zhuǎn) | Java8初體驗(一)lambda達式語法

    摘要:初體驗下面進入本文的正題表達式。接下來展示表達式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構(gòu)造器引用進一步簡化了表達式的書寫,但是個人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯(lián)系 tengfei@ifeve.com 本文主要記錄自己學(xué)習(xí)Java8的歷程,方便大家一起探討和自己的備忘。因為本人也是剛剛開始學(xué)習(xí)Java8,所以文中肯定有錯誤和理解偏...

    Lucky_Boy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<