站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        介紹Java8語(yǔ)法糖之Lambda表達(dá)式

        介紹Java8語(yǔ)法糖之Lambda表達(dá)式

        免費(fèi)學(xué)習(xí)推薦:java基礎(chǔ)教程

        一、Lambda表達(dá)式簡(jiǎn)介

        Lambda表達(dá)式,是Java8的一個(gè)新特性,也是Java8中最值得學(xué)習(xí)的新特性之一。(另一個(gè)新特性是流式編程。)

        • Lambda表達(dá)式,從本質(zhì)上講是一個(gè)匿名方法??梢允褂眠@個(gè)匿名方法,實(shí)現(xiàn)接口中的方法

        • 功能:通常使用Lambda表達(dá)式,是為了簡(jiǎn)化接口實(shí)現(xiàn)的。關(guān)于接口實(shí)現(xiàn)可以有多種方式實(shí)現(xiàn),例如:①設(shè)計(jì)接口的實(shí)現(xiàn)類(lèi)、②使用匿名內(nèi)部類(lèi)。但是③使用lambda表達(dá)式,比這兩種方式都簡(jiǎn)單。

        • 要求:lambda表達(dá)式,只能實(shí)現(xiàn)函數(shù)式接口:即一個(gè)接口中,要求實(shí)現(xiàn)類(lèi)必須實(shí)現(xiàn)的抽象方法,有且只有一個(gè)。

        @FunctionalInterface注解 ,用在接口之前,用來(lái)判斷接口是否是一個(gè)函數(shù)式接口。如果不是函數(shù)式接口會(huì)報(bào)錯(cuò)。功能類(lèi)似于@Override。

        二、Lambda表達(dá)式語(yǔ)法

        lambda表達(dá)式本質(zhì)上是一個(gè)匿名方法,因此再寫(xiě)lambda表達(dá)式時(shí),不需要關(guān)心方法名是什么,也不需要關(guān)心返回值類(lèi)型。只需要關(guān)心兩部分:參數(shù)列表、方法體。

        • ()參數(shù)部分:方法的參數(shù)列表,要求和實(shí)現(xiàn)的接口中的方法參數(shù)部分一致,包括參數(shù)的數(shù)量和類(lèi)型。
        • {}方法體部分:方法的實(shí)現(xiàn)部分,如果接口中定義的方法有返回值,則在實(shí)現(xiàn)時(shí),注意返回值的返回。
        • -> :分隔參數(shù)部分和方法體部分。
        Lambda表達(dá)式基礎(chǔ)語(yǔ)法:(參數(shù)) ->{ 	方法體}

        下面定義6種參數(shù)和返回值各不相同的函數(shù)式接口,分別使用lambda表達(dá)式對(duì)接口中的方法進(jìn)行實(shí)現(xiàn):

        介紹Java8語(yǔ)法糖之Lambda表達(dá)式

        下面是針對(duì)上面6種函數(shù)式接口的lambda表達(dá)式實(shí)現(xiàn)。

        /**  * @Description:  * @author Guoqianliang  * @date 19:50 - 2021/2/15  */public class BasicSyntax {     public static void main(String[] args) {         // 1.實(shí)現(xiàn)無(wú)參數(shù),無(wú)返回值的函數(shù)式接口         NoneReturnNoneParameter lambda1 = () -> {             System.out.println("這是無(wú)參,無(wú)返回值的方法");         };         lambda1.test();          // 2.實(shí)現(xiàn)一個(gè)參數(shù),無(wú)返回值的函數(shù)式接口         NoneReturnSingleParameter lambda2 = (int a) -> {             System.out.println("這是一個(gè)參數(shù),無(wú)返回值的方法,參數(shù)a:" + a);         };         lambda2.test(10);          // 3.實(shí)現(xiàn)多個(gè)參數(shù),無(wú)返回值的函數(shù)式接口         NoneReturnMutipleParameter lambda3 = (int a, int b) -> {             System.out.println("這是多個(gè)參數(shù),無(wú)返回值的方法,參數(shù)a=" + a + ",b=" + b);         };         lambda3.test(10, 20);          // 4.實(shí)現(xiàn)無(wú)參數(shù),有返回值有返回值的函數(shù)式接口         SingleReturnNoneParameter lambda4 = () -> {             System.out.println("這是無(wú)參數(shù),有返回值的方法,返回值是:");             return 10;         };         System.out.println(lambda4.test());          // 5.實(shí)現(xiàn)一個(gè)參數(shù),有返回值的函數(shù)式接口         SingleReturnSingleParameter lambda5 = (int a) -> {             System.out.println("這是一個(gè)參數(shù),有返回值的方法,返回值是:");             return a;         };         System.out.println(lambda5.test(10));          // 6.實(shí)現(xiàn)多個(gè)參數(shù),有返回值的函數(shù)式接口         SingleReturnMutipleParameter lambda6 = (int a, int b) -> {             System.out.println("這是多個(gè)參數(shù),有返回值的方法,返回值是:");             return a + b;         };         System.out.println(lambda6.test(1, 2));     }}

        語(yǔ)法精簡(jiǎn)進(jìn)階:

        • 參數(shù)列表的參數(shù)類(lèi)型可以省略。
        • 如果參數(shù)列表中的參數(shù)有且只有一個(gè),可以省略小括號(hào)。
        • 如果方法體中只有一條語(yǔ)句,可以省略大括號(hào)。(注:如果這條語(yǔ)句是返回語(yǔ)句,省略了大括號(hào)后也要把return關(guān)鍵字省略)

        三、函數(shù)引用

        lambda表達(dá)式是為了簡(jiǎn)化接口。在lambda表達(dá)式中,不應(yīng)該出現(xiàn)比較復(fù)雜的邏輯。如果需要處理的邏輯比較復(fù)雜,一般情況會(huì)單獨(dú)寫(xiě)一個(gè)方法。在lambda表達(dá)式中直接引用這個(gè)方法即可。即引用一個(gè)已經(jīng)存在的方法,使其代替lambda表達(dá)式完成接口的實(shí)現(xiàn)。

        1.靜態(tài)方法引用

        語(yǔ)法:類(lèi)::靜態(tài)方法

        • 在引用的方法后面,不要添加小括號(hào)。
        • 引用的這個(gè)方法,參數(shù)(數(shù)量、類(lèi)型)和返回值,必須要跟接口中定義的一致。
        /**  * @Description: 方法引用  * @author Guoqianliang  * @date 0:26 - 2021/2/16  */public class Lambda1 {      private static interface Calculate {         int calculate(int a, int b);     }      private static int calculate(int x, int y) {         if (x > y) {             return x - y;         } else if (x < y) {             return y - x;         }         return x + y;     }      public static void main(String[] args) {         // 靜態(tài)方法引用         Calculate calculate = Lambda1::calculate;         System.out.println(calculate.calculate(10, 20));     }}

        2.非靜態(tài)方法引用

        語(yǔ)法:對(duì)象::非靜態(tài)方法

        • 在引用的方法后面,不要添加小括號(hào)。
        • 引用的這個(gè)方法,參數(shù)(數(shù)量、類(lèi)型)和返回值,必須要跟接口中定義的一致。
        /**  * @Description: 方法引用  * @author Guoqianliang  * @date 0:26 - 2021/2/16  */public class Lambda1 {      private static interface Calculate {         int calculate(int a, int b);     }      // 非靜態(tài)方法     private int calculate2(int a, int b) {         if (a != b) {             return a - b;         }         return a + b;     }      public static void main(String[] args) {         // 非靜態(tài)方法引用         Calculate calculate2 = new Lambda1()::calculate2;         System.out.println(calculate.calculate(10, 20));     }}

        3.構(gòu)造方法引用

        語(yǔ)法:類(lèi)名::new

        • 可以通過(guò)接口中的方法的參數(shù),區(qū)分引用不同的構(gòu)造方法。
        • 如果某一個(gè)函數(shù)式接口中定義的方法,僅僅是為了得到一個(gè)類(lèi)的對(duì)象。此時(shí)就可以使用構(gòu)造方法的引用,簡(jiǎn)化這個(gè)方法的實(shí)現(xiàn)。
        /**  * @Description: 構(gòu)造方法引用  * @author Guoqianliang  * @date 11:20 - 2021/2/16  */public class Lambda2 {      @FunctionalInterface     private interface GetPersonWithNoneParameter {         Person get();     }      @FunctionalInterface     private interface GetPersonWithSingleParameter {         Person get(String name);     }      @FunctionalInterface     private interface GetPersonWithMutipleParameter {         Person get(String name, int age);     }      private static class Person {         String name;         int age;          public Person() {             System.out.println("Person類(lèi)的無(wú)參構(gòu)造方法執(zhí)行了");         }          public Person(String name) {             this.name = name;             System.out.println("Person類(lèi)的有參構(gòu)造方法執(zhí)行了");         }          public Person(String name, int age) {             this.name = name;             this.age = age;             System.out.println("Person類(lèi)的兩個(gè)參數(shù)的構(gòu)造方法執(zhí)行了");         }     }      public static void main(String[] args) {         // 1.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithNoneParameter接口         GetPersonWithNoneParameter getPerson = Person::new;         // 2.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithSingleParameter接口         GetPersonWithSingleParameter getPerson2 = Person::new;         // 3.使用lambda表達(dá)式,實(shí)現(xiàn)GetPersonWithMutipleParameter接口         GetPersonWithMutipleParameter getPerson3 = Person::new;          System.out.println(getPerson.get());         System.out.println(getPerson2.get("樹(shù)先生"));         System.out.println(getPerson3.get("你好", 23));     }}

        4.對(duì)象方法的特殊引用

        使用lambda表達(dá)式實(shí)現(xiàn)某些接口時(shí),如果lambda表達(dá)式中包含了某一個(gè)對(duì)象,此時(shí)方法體中,直接使用這個(gè)對(duì)象調(diào)用它的某一個(gè)方法就可以完成整體的邏輯。

        /**  * @Description: 對(duì)象方法的特殊應(yīng)用  * @author Guoqianliang  * @date 11:54 - 2021/2/16  */public class Lambda3 {      @FunctionalInterface     private interface MyInterface {         // String get(Person person);         void set(Person person, String name);     }      private static class Person {         private String name;          public void setName(String name) {             this.name = name;         }          public String getName() {             return name;         }     }      public static void main(String[] args) {         Person p1 = new Person();         p1.setName("小明");//        邏輯實(shí)現(xiàn)只是為了獲取到對(duì)象的名字//        MyInterface lambda2 = Person::getName;//        System.out.println(lambda2.get(p1));                  // 邏輯實(shí)現(xiàn)只是為了給對(duì)象的某些屬性進(jìn)行賦值         MyInterface lambda1 = (x, n) -> x.setName(n);         MyInterface lambda2 = Person::setName;         lambda2.set(p1, "李華");         System.out.println(p1.getName());     }}

        四、Lambda表達(dá)式需要注意的問(wèn)題

        如果用到局部變量,默認(rèn)會(huì)被聲明為常量,不能發(fā)生值的改變。

        /**  * @Description:  * @author Guoqianliang  * @date 13:05 - 2021/2/16  */public class Lambda4 {     public static void main(String[] args) {         // 1.定義一個(gè)局部變量         int x = 10;         // 2.使用lambda表達(dá)式實(shí)現(xiàn)接口         LambdaTest lambda = () -> {             System.out.println("x=" + x);         };         // 3. 無(wú)法修改常量x         // x=20;     }}@FunctionalInterfaceinterface LambdaTest {     void test();}

        相關(guān)學(xué)習(xí)推薦:java基礎(chǔ)

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 色欲国产麻豆一精品一AV一免费| 2021国产成人精品国产| 午夜精品久久久久久99热| 久久精品国产亚洲沈樵| 免费精品无码AV片在线观看| 久久精品人妻一区二区三区| 亚洲国产精品国自产电影| 国产综合精品女在线观看| 在线中文字幕精品第5页| 国产精品高清免费网站| 精品乱人伦一区二区三区| 久久精品亚洲中文字幕无码麻豆| 欧美亚洲综合免费精品高清在线观看| 91精品国产91久久久久久青草 | 久久久精品国产亚洲成人满18免费网站 | 香蕉依依精品视频在线播放 | 亚洲AV永久无码精品一百度影院| 精品久久久久久无码人妻蜜桃| 午夜精品久视频在线观看| 91精品国产9l久久久久| 久久66热人妻偷产精品9| 亚洲午夜国产精品无码| 无码人妻一区二区三区精品视频| 久久精品视频91| 久久精品人妻一区二区三区| 国产精品午夜无码AV天美传媒| 91精品国产综合久久四虎久久无码一级 | 久久精品夜色噜噜亚洲A∨| 国产精品污WWW一区二区三区| 亚洲欧美精品伊人久久| 久久精品成人国产午夜| 国产亚洲婷婷香蕉久久精品| 国产成人精品免费午夜app| 国产精品欧美日韩| 国产精品久久毛片完整版| 国产精品爽爽va在线观看网站| 99在线精品视频| 911亚洲精品国内自产| 国产精品无码免费播放| 精品伦精品一区二区三区视频 | 久久精品国产清自在天天线|