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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java22-day13【Lambda表达式(标准格式、练习、注意事项)、接口组成更新(默认-静态-私有方法)、方法引用(构造器)】

發(fā)布時間:2024/9/30 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java22-day13【Lambda表达式(标准格式、练习、注意事项)、接口组成更新(默认-静态-私有方法)、方法引用(构造器)】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
  • 視頻+資料【鏈接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg? ?提取碼:zjxs】
  • Java基礎--學習筆記(零起點打開java世界的大門)--博客匯總表

??????

目? ?錄

01_體驗Lambda表達式

1.1、函數(shù)式編程思想概述

1.2、體驗Lambda表達式

02_Lambda表達式的標準格式

1.3、Lambda表達式的標準格式

03_Lambda表達式練習1(抽象方法無參無返回值)

1.4、Lambda表達式的練習

04_Lambda表達式練習2(抽象方法帶參無返回值)

05_Lambda表達式練習3(抽象方法帶參帶返回值)

06_Lambda表達式的省略模式

1.5、Lambda表達式的省略模式

07_Lambda表達式的注意事項

1.6、Lambda表達式的注意事項

08_Lambda表達式和匿名內(nèi)部類的區(qū)別

1.7、Lambda表達式和匿名內(nèi)部類的區(qū)別

09_接口組成更新概述

1.1、接口組成更新概述

10_接口中默認方法

1.2、接口中默認方法

11_接口中靜態(tài)方法

1.3、接口中靜態(tài)方法

12_接口中私有方法

1.4、接口中私有方法

13_體驗方法引用

1.1、體驗方法引用

14_方法引用符

1.2、方法引用符

15_引用類方法

1.3、Lambda表達式支持的方法引用

1.4、引用類方法

16_引用對象的實例方法

1.5、引用對象的實例方法

17_引用類的實例方法

1.6、引用類的實例方法

18_引用構造器

1.7、引用構造器


01_體驗Lambda表達式

1.1、函數(shù)式編程思想概述

在數(shù)學中,函數(shù)就是有輸入量、輸出量的一套計算方案,也就是“拿數(shù)據(jù)做操作”。

面向?qū)ο笏枷霃娬{(diào)“必須通過對象的形式來做事情”。

函數(shù)式思想則盡量忽略面向?qū)ο蟮膹碗s語法:“強調(diào)做什么,而不是以什么形式去做”。

而我們要學習的Lambda表達式就是函數(shù)式思想的體現(xiàn)。

1.2、體驗Lambda表達式

案例需求:啟動一個線程,在控制臺輸出一句話:多線程程序啟動了。

實現(xiàn)方式1:(麻煩)

  • 定義一個類MyRunnable實現(xiàn)Runnable接口,重寫run()方法
  • 創(chuàng)建MyRunnable類的對象
  • 創(chuàng)建Thread類的對象,把MyRunnable的對象作為構造參數(shù)傳遞
  • 啟動線程

實現(xiàn)方式2:

  • 匿名內(nèi)部類的方式改進

實現(xiàn)方式3:

  • Lambda表達式的方式改進

02_Lambda表達式的標準格式

1.3、Lambda表達式的標準格式

Lambda表達式的格式

  • 格式:(形式參數(shù)) -> {代碼塊}
  • 形式參數(shù):如果有多個參數(shù),參數(shù)之間用逗號隔開;如果沒有參數(shù),留空即可。
  • ->:由英文中畫線和大于符號組成,固定寫法。代表指向動作。
  • 代碼塊:是我們具體要做的事情,也就是以前我們寫的方法體內(nèi)容。

03_Lambda表達式練習1(抽象方法無參無返回值)

1.4、Lambda表達式的練習

Lambda表達式的使用前提:

  • 有一個接口。
  • 接口中有且僅有一個抽象方法。

練習描述

  • 無參無返回值抽象方法的練習。

練習1 操作步驟

  • 1.定義一個接口(Eatable),里面定義一個抽象方法:void eat();
  • 2.定義一個測試類(EatableDemo),在測試類中提供兩個方法:

一個方法是:useEatable(Eatable e)

一個方法是主方法,在主方法中調(diào)用useEatable方法

04_Lambda表達式練習2(抽象方法帶參無返回值)

練習描述

  • 有參無返回值抽象方法的練習。

練習2 操作步驟

  • 1.定義一個接口(Flyable),里面定義一個抽象方法:void fly(String s);
  • 2.定義一個測試類(FlyableDemo),在測試類中提供兩個方法:

一個方法是:useFlyable(Flyable f)

一個方法是主方法,在主方法中調(diào)用useFlyable方法

05_Lambda表達式練習3(抽象方法帶參帶返回值)

練習描述

  • 有參有返回值抽象方法的練習。

練習3 操作步驟

  • 定義一個接口(Addable),里面定義一個抽象方法:int add(int x,int y);
  • 定義一個測試類(AddableDemo),在測試類中提供兩個方法:

一個方法是:useAddable(Addable a)

一個方法是主方法,在主方法中調(diào)用useAddable方法

06_Lambda表達式的省略模式

1.5、Lambda表達式的省略模式

省略的規(guī)則:

  • 參數(shù)類型可以省略。但是有多個參數(shù)的情況下,不能只省略一個。
  • 如果參數(shù)有且僅有一個,那么小括號可以省略。
  • 如果代碼塊的語句只有一條,可以省略大括號和分號,和return關鍵字。

07_Lambda表達式的注意事項

1.6、Lambda表達式的注意事項

注意事項:

  • 使用Lambda必須要有接口,并且要求接口中有且僅有一個抽象方法。
  • 必須有上下文環(huán)境,才能推導出Lambda對應的接口。

根據(jù)局部變量的賦值得知Lambda對應的接口:Runnable r = () -> System.out.println("Lambda表達式");

根據(jù)調(diào)用方法的參數(shù)得知Lambda對應的接口:new Thread(() -> System.out.println("Lambda表達式")).start();

08_Lambda表達式和匿名內(nèi)部類的區(qū)別

1.7、Lambda表達式和匿名內(nèi)部類的區(qū)別

所需類型不同

  • 匿名內(nèi)部類:可以是接口,也可以是抽象類,還可以是具體類。
  • Lambda表達式:只能是接口。

使用限制不同

  • 如果接口中有且僅有一個抽象方法,可以使用Lambda表達式,也可以使用匿名內(nèi)部類。
  • 如果接口中多于一個抽象方法,只能使用匿名內(nèi)部類,而不能使用Lambda表達式。

實現(xiàn)原理不同

  • 匿名內(nèi)部類:編譯之后,產(chǎn)生一個單獨的.class字節(jié)碼文件。
  • Lambda表達式:編譯之后,沒有一個單獨的.class字節(jié)碼文件。對應的字節(jié)碼會在運行的時候動態(tài)生成。

? ?

09_接口組成更新概述

1.1、接口組成更新概述

常量

  • public static final

抽象方法

  • public abstract
  • 默認方法(Java 8)
  • 靜態(tài)方法(Java 8)
  • 私有方法(Java 9)

10_接口中默認方法

1.2、接口中默認方法

接口中默認方法的定義格式:

  • 格式:public default 返回值類型 方法名(參數(shù)列表) { }
  • 范例:public default?void show3() { }

接口中默認方法的注意事項

  • 默認方法不是抽象方法,所以不強制被重寫。但是可以被重寫,重寫的時候去掉default關鍵字。
  • public可以省略,default不能省略。

隨著使用,接口滿足不了需求,接口需要升級,接口需要添加新的功能“void show3();”,實現(xiàn)類MyInterfaceImplOne、MyInterfaceImplTwo需要重寫所有抽象方法。麻煩!假如實現(xiàn)類有很多,接口中添加了一個方法,所有的實現(xiàn)類都要重寫此方法;可能只有部分實現(xiàn)類需要重寫此方法,所以這種設計不好。

接口的升級,可以這樣做:新增接口MyInterfaceSon繼承MyInterface實現(xiàn)“void show3();”,讓實現(xiàn)類繼承此接口(將來需要實現(xiàn)show3()方法的實現(xiàn)類實現(xiàn)MyInterfaceSon即可),不影響現(xiàn)有代碼,解決接口的升級問題。弊端:每次添加新功能,都要新增子接口,并產(chǎn)生新的關系;實現(xiàn)show3()方法的實現(xiàn)類需要繼承MyInterfaceSon接口;如果代碼更新快,代碼體系(代碼繼承、實現(xiàn)結構)就會變得非常龐大,不利于程序的維護。

更好的方式:默認方法(Java 8)

public變成灰色:public可以省略,default不能省略。

11_接口中靜態(tài)方法

1.3、接口中靜態(tài)方法

接口中靜態(tài)方法的定義格式:

  • 格式:public static 返回值類型 方法名(參數(shù)列表) { }
  • 范例:public static void show() { }

接口中靜態(tài)方法的注意事項

  • 靜態(tài)方法只能通過接口名調(diào)用,不能通過實現(xiàn)類名或者對象名調(diào)用。
  • public可以省略,static不能省略。

12_接口中私有方法

1.4、接口中私有方法

私有方法產(chǎn)生原因:

Java 9中新增了帶方法體的私有方法,這其實在Java 8中就埋下了伏筆:Java 8允許在接口中定義帶方法體的默認方法和靜態(tài)方法。這樣可能會引發(fā)一個問題:當兩個默認方法或者靜態(tài)方法中包含一段相同的代碼實現(xiàn)時,程序必然考慮將這段實現(xiàn)代碼抽取成一個共性方法,而這個共性方法是不需要讓別人使用的,因此用私有給隱藏起來,這就是Java 9增加私有方法的必然性。

接口中私有方法的定義格式:

  • 格式1:private 返回值類型 方法名(參數(shù)列表) { }
  • 范例1:private void show() { }
  • 格式2:private static 返回值類型 方法名(參數(shù)列表) { }
  • 范例2:private static void method() { }

接口中私有方法的注意事項

  • 默認方法可以調(diào)用私有的靜態(tài)方法和非靜態(tài)方法。
  • 靜態(tài)方法只能調(diào)用私有的靜態(tài)方法。

method1()方法是靜態(tài)方法,show()方法不是靜態(tài)方法。靜態(tài)方法不能調(diào)用非靜態(tài)方法:?

13_體驗方法引用

1.1、體驗方法引用

方法引用的出現(xiàn)原因:

在使用Lambda表達式的時候,我們實際上傳遞進去的代碼就是一種解決方案:拿參數(shù)做操作。

那么考慮一種情況:如果我們在Lambda中所指定的操作方案,已經(jīng)有地方存在相同方案,那是否還有必要再寫重復邏輯呢?

答案肯定是沒有必要。

那我們又是如何使用已經(jīng)存在的方案的呢?

這就是我們要講解的方法引用,我們是通過方法引用來使用已經(jīng)存在的方案。

14_方法引用符

1.2、方法引用符

方法引用符:

  • :: 該符號為引用運算符,而它所在的表達式被稱為方法引用。

回顧一下我們在體驗方法引用中的代碼:

  • Lambda表達式:usePrintable(s -> System.out.println(s));

分析:拿到參數(shù)s之后,通過Lambda表達式,傳遞給System.out.println方法去處理。

  • 方法引用:usePrintable(System.out::println);

分析:直接使用System.out中的println方法來取代Lambda,代碼更加的簡潔。

推導與省略:

  • 如果使用Lambda,那么根據(jù)“可推導就是可省略”的原則,無需指定參數(shù)類型,也無需指定的重載形式, 它們都將被自動推導。
  • 如果使用方法引用,也是同樣可以根據(jù)上下文進行推導。
  • 方法引用是Lambda的孿生兄弟。

15_引用類方法

1.3、Lambda表達式支持的方法引用

常見的引用方式:

  • 引用類方法
  • 引用對象的實例方法
  • 引用類的構造方法
  • 引用構造器

1.4、引用類方法

引用類方法,其實就是引用類的靜態(tài)方法。

  • 格式:類名::靜態(tài)方法
  • 范例:Integer::parseInt

Integer類的方法:public static int parseInt(String s) 將此String轉(zhuǎn)換為int類型數(shù)據(jù)

練習描述:

  • 定義一個接口(Converter),里面定義一個抽象方法。

int convert(String s);

  • 定義一個測試類(ConverterDemo),在測試類中提供兩個方法。

一個方法是:useConverter(Converter c)

一個方法是主方法,在主方法中調(diào)用useConverter方法

使用說明:Lambda表達式被類方法替代的時候,它的形式參數(shù)全部傳遞給靜態(tài)方法作為參數(shù)。

16_引用對象的實例方法

1.5、引用對象的實例方法

引用對象的實例方法,其實就引用類中的成員方法。

  • 格式:對象::成員方法
  • 范例:"HelloWorld"::toUpperCase

String類中的方法:public String toUpperCase() 將此String所有字符轉(zhuǎn)換為大寫。

練習描述:

  • 定義一個類(PrintString),里面定義一個方法。

public void printUpper(String s):把字符串參數(shù)變成大寫的數(shù)據(jù),然后在控制臺輸出。

  • 定義一個接口(Printer),里面定義一個抽象方法。

void printUpperCase(String s)

  • 定義一個測試類(PrinterDemo),在測試類中提供兩個方法。

一個方法是:usePrinter(Printer p)

一個方法是主方法,在主方法中調(diào)用usePrinter方法。

使用說明:Lambda表達式被對象的實例方法替代的時候,它的形式參數(shù)全部傳遞給該方法作為參數(shù)。

17_引用類的實例方法

1.6、引用類的實例方法

引用類的實例方法,其實就是引用類中的成員方法。

  • 格式:類名::成員方法
  • 范例:String::substring

String類中的方法:public String substring(int beginIndex,int endIndex)

從beginIndex開始到endIndex結束,截取字符串。返回一個子串,子串的長度為endIndex-beginIndex。

練習描述:

  • 定義一個接口(MyString),里面定義一個抽象方法:

String mySubString(String s,int x,int y);

  • 定義一個測試類(MyStringDemo),在測試類中提供兩個方法:

一個方法是:useMyString(MyString my)

一個方法是主方法,在主方法中調(diào)用useMyString方法

使用說明:Lambda表達式被類的實例方法替代的時候,第一個參數(shù)作為調(diào)用者,后面的參數(shù)全部傳遞給該方法作為參數(shù)。

18_引用構造器

1.7、引用構造器

引用構造器,其實就是引用構造方法。

  • 格式:類名::new
  • 范例:Student::new

練習描述:

  • 定義一個類(Student),里面有兩個成員變量(name,age)

并提供無參構造方法和帶參構造方法,以及成員變量對應的get和set方法。

  • 定義一個接口(StudentBuilder),里面定義一個抽象方法:

Student build(String name,int age);

  • 定義一個測試類(StudentDemo),在測試類中提供兩個方法:

一個方法是:useStudentBuilder(StudentBuilder s)

一個方法是主方法,在主方法中調(diào)用useStudentBuilder方法

使用說明:Lambda表達式被構造器替代的時候,它的形式參數(shù)全部傳遞給構造器作為參數(shù)。

總結

以上是生活随笔為你收集整理的Java22-day13【Lambda表达式(标准格式、练习、注意事项)、接口组成更新(默认-静态-私有方法)、方法引用(构造器)】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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