日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Lambda表达式详解

發(fā)布時(shí)間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda表达式详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

01:Lambda表達(dá)式

Lambda表達(dá)式標(biāo)準(zhǔn)格式:

  • 由三部分組成:
    a.一些參數(shù)
    b.一個(gè)箭頭
    c.一段代碼

  • 格式:
    (參數(shù)列表) ->{ 一些重寫方法的代碼};

  • 解釋說(shuō)明格式:
    ():接口中抽象方法的參數(shù)列表,沒(méi)有參數(shù),就空著;有參數(shù)就寫出參數(shù),多個(gè)參數(shù)使用逗號(hào)分隔,
    ->:傳遞的意思,把參數(shù)傳遞給方法體{}
    {}:重寫接口的抽象方法的方法體

package com.Lambda;/*Lambda表達(dá)式標(biāo)準(zhǔn)格式:由三部分組成:a.一些參數(shù)b.一個(gè)箭頭c.一段代碼格式:(參數(shù)列表) ->{ 一些重寫方法的代碼};解釋說(shuō)明格式:():接口中抽象方法的參數(shù)列表,沒(méi)有參數(shù),就空著;有參數(shù)就寫出參數(shù),多個(gè)參數(shù)使用逗號(hào)分隔->:傳遞的意思,把參數(shù)傳遞給方法體{}{}:重寫接口的抽象方法的方法體*/ public class Demo02Lambda {public static void main(String[] args) {//使用匿名內(nèi)部類的方式實(shí)現(xiàn)多線程new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "新線程創(chuàng)建了");}}).start();//使用Lambda表達(dá)式,實(shí)現(xiàn)多線程new Thread(() ->{System.out.println(Thread.currentThread().getName() + "新線程創(chuàng)建了");}).start();} }

02:Lambda表達(dá)式無(wú)參數(shù)無(wú)返回值案例

需求

  • 給定一個(gè)廚子Cook接口,內(nèi)含唯一的抽象方法makeFood,且無(wú)參數(shù)、無(wú)返回值。

  • 使用Lambda的標(biāo)準(zhǔn)格式調(diào)用invokeCook方法,打印輸出"吃飯啦!"字樣

package com.Lambda; /*需求:給定一個(gè)廚子Cook接口,內(nèi)含唯一的抽象方法makeFood,且無(wú)參數(shù)、無(wú)返回值。使用Lambda的標(biāo)準(zhǔn)格式調(diào)用invokeCook方法,打印輸出"吃飯啦!"字樣*/ public class Demo03Cook {public static void main(String[] args) {//調(diào)用invokeCoke方法,參數(shù)是Cook接口,傳遞Cook接口的匿名內(nèi)部類對(duì)象invokeCoke(new Cook() {@Overridepublic void makeFood() {System.out.println("吃飯啦");}});//使用Lambda表達(dá)式,簡(jiǎn)化匿名內(nèi)部類的書寫invokeCoke(()->{System.out.println("吃飯啦");}); }//定義一個(gè)方法,參數(shù)傳遞Cook接口,方法內(nèi)部調(diào)用Cook接口中的方法makeFoodpublic static void invokeCoke(Cook cook){cook.makeFood();} }

Cook接口

package com.Lambda;/*定義一個(gè)Cook接口,內(nèi)含唯一的抽象方法makeFood*/ public interface Cook {//定義無(wú)參數(shù)無(wú)返回值的方法makeFoodpublic abstract void makeFood(); }

03:Lambda表達(dá)式有參數(shù)有返回值案例

lambda表達(dá)式有參數(shù)有返回值的練習(xí)
需求

  • 使用數(shù)組存儲(chǔ)多個(gè)Person對(duì)象

  • 對(duì)數(shù)組中的Person對(duì)象使用Arrays的sort方法通過(guò)年齡進(jìn)行升序排序

package com.Lambda;import java.util.Arrays; import java.util.Comparator;/*lambda表達(dá)式有參數(shù)有返回值的練習(xí)需求:使用數(shù)組存儲(chǔ)多個(gè)Person對(duì)象對(duì)數(shù)組中的Person對(duì)象使用Arrays的sort方法通過(guò)年齡進(jìn)行升序排序*/ public class Demo04Arrays {public static void main(String[] args) {//使用數(shù)組存儲(chǔ)多個(gè)Person對(duì)象Person[] arr = {new Person("柳巖",39),new Person("楊冪",29),new Person("迪麗熱巴",26)};//對(duì)數(shù)組中的Person對(duì)象使用Arrays對(duì)象使用Arrays的sort方法通過(guò)年齡進(jìn)行升序(前邊-后邊)排序 // Arrays.sort(arr, new Comparator<Person>() { // @Override // public int compare(Person o1, Person o2) { // return o1.getAge()-o2.getAge(); // } // });//使用Lambda表達(dá)式,簡(jiǎn)化匿名內(nèi)部類Arrays.sort(arr,(Person o1,Person o2) ->{return o1.getAge()-o2.getAge(); } );//遍歷數(shù)組for (Person p : arr) {System.out.println(p);}} }

Person類

package com.Lambda;public class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;} }

04:Lambda表達(dá)式有參數(shù)有返回值案例(自定義接口)

Lambda表達(dá)式有參數(shù)有返回值的練習(xí)
需求

  • 給定一個(gè)計(jì)算器Calculator接口,內(nèi)含抽象方法calc可以將兩個(gè)int數(shù)字相加得到和值

  • 使用Lambda的標(biāo)準(zhǔn)格式調(diào)用invokeCalc方法,完成120和130的相加計(jì)算

package com.Lambda;/*Lambda表達(dá)式有參數(shù)有返回值的練習(xí)需求:給定一個(gè)計(jì)算器Calculator接口,內(nèi)含抽象方法calc可以將兩個(gè)int數(shù)字相加得到和值使用Lambda的標(biāo)準(zhǔn)格式調(diào)用invokeCalc方法,完成120和130的相加計(jì)算*/ public class Demo05Calculator {public static void main(String[] args) {//調(diào)用invokeCalc方法,方法的參數(shù)是一個(gè)接口,可以使用匿名內(nèi)部類invokeCalc(120, 130, new Calculator() {@Overridepublic int calc(int a, int b) {return a+b;}});//使用Lambda表達(dá)式簡(jiǎn)化匿名內(nèi)部類的書寫invokeCalc(120,130,(int a,int b)->{return a+b;});}/*定義一個(gè)方法參數(shù)傳遞兩個(gè)int類型的整數(shù)參數(shù)傳遞Calculator接口方法調(diào)用Calculator中的方法calc計(jì)算兩個(gè)整數(shù)的和*/public static void invokeCalc(int a,int b,Calculator c){int sum = a + b;System.out.println(sum);} }

計(jì)算器Calculator接口

package com.Lambda;/*給定一個(gè)計(jì)算器Calculator接口,內(nèi)含抽象方法calc可以將兩個(gè)int數(shù)字相加得到和值*/ public interface Calculator {//定義一個(gè)計(jì)算兩個(gè)int整數(shù)和的方法并返回結(jié)果public abstract int calc(int a,int b); }

05:Lambda表達(dá)式省略格式

Lambda表達(dá)式:是可推導(dǎo),可以省略

  • 凡是根據(jù)上下文推導(dǎo)出來(lái)的內(nèi)容,都可以省略書寫

  • 可以省略的內(nèi)容
    1.(參數(shù)列表):括號(hào)中參數(shù)列表的數(shù)據(jù)類型嗎,可以省略不寫
    2.(參數(shù)列表):括號(hào)中的參數(shù)如果只有一個(gè),那么類型和()都可以省略
    3.{一些代碼}:如果{}中的代碼只有一行,無(wú)論是否有返回值,都可以省略{},return,分號(hào);)
    注意:要省略{},return,分號(hào);必須一起省略

package com.Lambda;import com.sun.org.apache.bcel.internal.generic.ARRAYLENGTH;import java.util.ArrayList;/*Lambda表達(dá)式:是可推導(dǎo),可以省略凡是根據(jù)上下文推導(dǎo)出來(lái)的內(nèi)容,都可以省略書寫可以省略的內(nèi)容1.(參數(shù)列表):括號(hào)中參數(shù)列表的數(shù)據(jù)類型嗎,可以省略不寫2.(參數(shù)列表):括號(hào)中的參數(shù)如果只有一個(gè),那么類型和()都可以省略3.{一些代碼}:如果{}中的代碼只有一行,無(wú)論是否有返回值,都可以省略{},return,分號(hào);)注意:要省略{},return,分號(hào);必須一起省略*/ public class Demo06ArrayList {public static void main(String[] args) {//在JDK1.7之前,創(chuàng)建集合對(duì)象必須把前后的泛型都寫上ArrayList<String> list01 = new ArrayList<String>();//在JDK1.7版本之后,=號(hào)后邊的泛型可以省略,后邊的泛型可以根據(jù)前邊的泛型推導(dǎo)出來(lái)ArrayList<String> list02 = new ArrayList<>();} } package com.Lambda; public class Demo02Lambda {public static void main(String[] args) {//使用匿名內(nèi)部類的方式實(shí)現(xiàn)多線程new Thread(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "新線程創(chuàng)建了");}}).start();//使用Lambda表達(dá)式,實(shí)現(xiàn)多線程new Thread(() ->{System.out.println(Thread.currentThread().getName() + "新線程創(chuàng)建了");}).start();//優(yōu)化省略Lambdanew Thread(() -> System.out.println(Thread.currentThread().getName() + "新線程創(chuàng)建了")).start();} } package com.Lambda;public class Demo03Cook {public static void main(String[] args) {//調(diào)用invokeCoke方法,參數(shù)是Cook接口,傳遞Cook接口的匿名內(nèi)部類對(duì)象invokeCoke(new Cook() {@Overridepublic void makeFood() {System.out.println("吃飯啦");}});//使用Lambda表達(dá)式,簡(jiǎn)化匿名內(nèi)部類的書寫invokeCoke(()->{System.out.println("吃飯啦");});//優(yōu)化省略LambdainvokeCoke(()-> System.out.println("吃飯啦"));}//定義一個(gè)方法,參數(shù)傳遞Cook接口,方法內(nèi)部調(diào)用Cook接口中的方法makeFoodpublic static void invokeCoke(Cook cook){cook.makeFood();} } package com.Lambda;import java.util.Arrays; import java.util.Comparator;public class Demo04Arrays {public static void main(String[] args) {//使用數(shù)組存儲(chǔ)多個(gè)Person對(duì)象Person[] arr = {new Person("柳巖",39),new Person("楊冪",29),new Person("迪麗熱巴",26)};//對(duì)數(shù)組中的Person對(duì)象使用Arrays對(duì)象使用Arrays的sort方法通過(guò)年齡進(jìn)行升序(前邊-后邊)排序 // Arrays.sort(arr, new Comparator<Person>() { // @Override // public int compare(Person o1, Person o2) { // return o1.getAge()-o2.getAge(); // } // });//使用Lambda表達(dá)式,簡(jiǎn)化匿名內(nèi)部類Arrays.sort(arr,(Person o1,Person o2) ->{return o1.getAge()-o2.getAge(); } );//優(yōu)化省略LambdaArrays.sort(arr,(o1, o2) ->o1.getAge()-o2.getAge());//遍歷數(shù)組for (Person p : arr) {System.out.println(p);}} } package com.Lambda;public class Demo05Calculator {public static void main(String[] args) {//調(diào)用invokeCalc方法,方法的參數(shù)是一個(gè)接口,可以使用匿名內(nèi)部類invokeCalc(120, 130, new Calculator() {@Overridepublic int calc(int a, int b) {return a+b;}});//使用Lambda表達(dá)式簡(jiǎn)化匿名內(nèi)部類的書寫invokeCalc(120,130,(int a,int b)->{return a+b;});//優(yōu)化省略LambdainvokeCalc(120,130,(a,b)-> a+b);}/*定義一個(gè)方法參數(shù)傳遞兩個(gè)int類型的整數(shù)參數(shù)傳遞Calculator接口方法調(diào)用Calculator中的方法calc計(jì)算兩個(gè)整數(shù)的和*/public static void invokeCalc(int a,int b,Calculator c){int sum = a + b;System.out.println(sum);} }

06:Lambda使用前提

Lambda表達(dá)式使用前提

  • 1.使用Lambda必須具有接口,且要求接口中有且僅有一個(gè)抽象方法
    無(wú)論是JDK內(nèi)置的Runnable、Comparator接口還是自定義的接口,只有當(dāng)接口中的抽象方法存在且唯一時(shí),才可以使用Lambda
  • 2.使用Lambda必須具有上下文推斷
    也就是方法的參數(shù)或局部變量類型必須為L(zhǎng)ambda對(duì)應(yīng)的接口類型,才能使用Lambda作為該接口的實(shí)例。
  • 備注:有且僅有一個(gè)抽象方法的接口.稱為"函數(shù)式編程"

總結(jié)

以上是生活随笔為你收集整理的Lambda表达式详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。