Java基础day22
生活随笔
收集整理的這篇文章主要介紹了
Java基础day22
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java基礎(chǔ)day22
- Java基礎(chǔ)day22-Lambda&方法引用
- 1.Lambda表達(dá)式
- 1.1體驗(yàn)Lambda表達(dá)式
- 1.2Lambda表達(dá)式的標(biāo)準(zhǔn)格式
- 1.3Lambda表達(dá)式練習(xí)1
- 1.4Lambda表達(dá)式練習(xí)2
- 1.5Lambda表達(dá)式練習(xí)3
- 1.6Lambda表達(dá)式的省略模式
- 1.7Lambda表達(dá)式的注意事項(xiàng)
- 1.8Lambda表達(dá)式和匿名內(nèi)部類的區(qū)別
- 2.接口組成更新
- 2.1接口組成更新概述
- 2.2接口中默認(rèn)方法
- 2.3接口中靜態(tài)方法
- 2.4接口中私有方法
- 3.方法引用
- 3.1體驗(yàn)方法引用
- 3.2方法引用符
- 3.3引用類方法
- 3.4引用對(duì)象的實(shí)例方法
- 3.5引用類的實(shí)例方法
- 3.6引用構(gòu)造器【應(yīng)用】
Java基礎(chǔ)day22-Lambda&方法引用
1.Lambda表達(dá)式
1.1體驗(yàn)Lambda表達(dá)式
- 案例需求
啟動(dòng)一個(gè)線程,在控制臺(tái)輸出一句話:多線程程序啟動(dòng)了 - 實(shí)現(xiàn)方式一
實(shí)現(xiàn)步驟
? 定義一個(gè)類MyRunnable實(shí)現(xiàn)Runnable接口,重寫run()方法
? 創(chuàng)建MyRunnable類的對(duì)象
? 創(chuàng)建Thread類的對(duì)象,把MyRunnable的對(duì)象作為構(gòu)造參數(shù)傳遞
? 啟動(dòng)線程 - 實(shí)現(xiàn)方式二
匿名內(nèi)部類的方式改進(jìn) - 實(shí)現(xiàn)方式三
Lambda表達(dá)式的方式改進(jìn) - 代碼演示
- 函數(shù)式編程思想概述
函數(shù)式思想則盡量忽略面向?qū)ο蟮膹?fù)雜語法:“強(qiáng)調(diào)做什么,而不是以什么形式去做”
而我們要學(xué)習(xí)的Lambda表達(dá)式就是函數(shù)式思想的體現(xiàn)
1.2Lambda表達(dá)式的標(biāo)準(zhǔn)格式
- 格式:
(形式參數(shù)) -> {代碼塊}
?形式參數(shù):如果有多個(gè)參數(shù),參數(shù)之間用逗號(hào)隔開;如果沒有參數(shù),留空即可
?->:由英文中畫線和大于符號(hào)組成,固定寫法。代表指向動(dòng)作
?代碼塊:是我們具體要做的事情,也就是以前我們寫的方法體內(nèi)容 - 組成Lambda表達(dá)式的三要素:
形式參數(shù),箭頭,代碼塊
1.3Lambda表達(dá)式練習(xí)1
- Lambda表達(dá)式的使用前提
有一個(gè)接口
接口中有且僅有一個(gè)抽象方法 - 練習(xí)描述
無參無返回值抽象方法的練習(xí) - 操作步驟
定義一個(gè)接口(Eatable),里面定義一個(gè)抽象方法:void eat();
定義一個(gè)測(cè)試類(EatableDemo),在測(cè)試類中提供兩個(gè)方法
一個(gè)方法是:useEatable(Eatable e)
一個(gè)方法是主方法,在主方法中調(diào)用useEatable方法 - 示例代碼
1.4Lambda表達(dá)式練習(xí)2
- 練習(xí)描述
有參無返回值抽象方法的練習(xí) - 操作步驟
定義一個(gè)接口(Flyable),里面定義一個(gè)抽象方法:void fly(String s);
定義一個(gè)測(cè)試類(FlyableDemo),在測(cè)試類中提供兩個(gè)方法
一個(gè)方法是:useFlyable(Flyable f)
一個(gè)方法是主方法,在主方法中調(diào)用useFlyable方法 - 示例代碼
1.5Lambda表達(dá)式練習(xí)3
- 練習(xí)描述
有參有返回值抽象方法的練習(xí) - 操作步驟
定義一個(gè)接口(Addable),里面定義一個(gè)抽象方法:int add(int x,int y);
定義一個(gè)測(cè)試類(AddableDemo),在測(cè)試類中提供兩個(gè)方法
一個(gè)方法是:useAddable(Addable a)
一個(gè)方法是主方法,在主方法中調(diào)用useAddable方法 - 示例代碼
1.6Lambda表達(dá)式的省略模式
- 省略的規(guī)則
參數(shù)類型可以省略。但是有多個(gè)參數(shù)的情況下,不能只省略一個(gè)
如果參數(shù)有且僅有一個(gè),那么小括號(hào)可以省略
如果代碼塊的語句只有一條,可以省略大括號(hào)和分號(hào),和return關(guān)鍵字 - 代碼演示
1.7Lambda表達(dá)式的注意事項(xiàng)
- 使用Lambda必須要有接口,并且要求接口中有且僅有一個(gè)抽象方法
- 必須有上下文環(huán)境,才能推導(dǎo)出Lambda對(duì)應(yīng)的接口
根據(jù)局部變量的賦值得知Lambda對(duì)應(yīng)的接口
?Runnable r = () -> System.out.println(“Lambda表達(dá)式”);
根據(jù)調(diào)用方法的參數(shù)得知Lambda對(duì)應(yīng)的接口
?new Thread(() -> System.out.println(“Lambda表達(dá)式”)).start();
1.8Lambda表達(dá)式和匿名內(nèi)部類的區(qū)別
- 所需類型不同
匿名內(nèi)部類:可以是接口,也可以是抽象類,還可以是具體類
Lambda表達(dá)式:只能是接口 - 使用限制不同
如果接口中有且僅有一個(gè)抽象方法,可以使用Lambda表達(dá)式,也可以使用匿名內(nèi)部類
如果接口中多于一個(gè)抽象方法,只能使用匿名內(nèi)部類,而不能使用Lambda表達(dá)式 - 實(shí)現(xiàn)原理不同
匿名內(nèi)部類:編譯之后,產(chǎn)生一個(gè)單獨(dú)的.class字節(jié)碼文件
Lambda表達(dá)式:編譯之后,沒有一個(gè)單獨(dú)的.class字節(jié)碼文件。對(duì)應(yīng)的字節(jié)碼會(huì)在運(yùn)行的時(shí)候動(dòng)態(tài)生成
2.接口組成更新
2.1接口組成更新概述
- 常量
public static final - 抽象方法
public abstract - 默認(rèn)方法(Java 8)
- 靜態(tài)方法(Java 8)
- 私有方法(Java 9)
2.2接口中默認(rèn)方法
- 格式
public default 返回值類型 方法名(參數(shù)列表) { } - 范例
- 注意事項(xiàng)
默認(rèn)方法不是抽象方法,所以不強(qiáng)制被重寫。但是可以被重寫,重寫的時(shí)候去掉default關(guān)鍵字
public可以省略,default不能省略
2.3接口中靜態(tài)方法
- 格式
public static 返回值類型 方法名(參數(shù)列表) { } - 范例
- 注意事項(xiàng)
靜態(tài)方法只能通過接口名調(diào)用,不能通過實(shí)現(xiàn)類名或者對(duì)象名調(diào)用
public可以省略,static不能省略
2.4接口中私有方法
- 私有方法產(chǎn)生原因
Java 9中新增了帶方法體的私有方法,這其實(shí)在Java 8中就埋下了伏筆:Java 8允許在接口中定義帶方法體的默認(rèn)方法和靜態(tài)方法。這樣可能就會(huì)引發(fā)一個(gè)問題:當(dāng)兩個(gè)默認(rèn)方法或者靜態(tài)方法中包含一段相同的代碼實(shí)現(xiàn)時(shí),程序必然考慮將這段實(shí)現(xiàn)代碼抽取成一個(gè)共性方法,而這個(gè)共性方法是不需要讓別人使用的,因此用私有給隱藏起來,這就是Java 9增加私有方法的必然性 - 定義格式
格式1
private 返回值類型 方法名(參數(shù)列表) { }
范例1
格式2
private static 返回值類型 方法名(參數(shù)列表) { }
范例2
- 注意事項(xiàng)
默認(rèn)方法可以調(diào)用私有的靜態(tài)方法和非靜態(tài)方法
靜態(tài)方法只能調(diào)用私有的靜態(tài)方法
3.方法引用
3.1體驗(yàn)方法引用
-
方法引用的出現(xiàn)原因
在使用Lambda表達(dá)式的時(shí)候,我們實(shí)際上傳遞進(jìn)去的代碼就是一種解決方案:拿參數(shù)做操作
那么考慮一種情況:如果我們?cè)贚ambda中所指定的操作方案,已經(jīng)有地方存在相同方案,那是否還有必要再
寫重復(fù)邏輯呢?答案肯定是沒有必要
那我們又是如何使用已經(jīng)存在的方案的呢?
這就是我們要講解的方法引用,我們是通過方法引用來使用已經(jīng)存在的方案 -
代碼演示
3.2方法引用符
- 方法引用符
:: 該符號(hào)為引用運(yùn)算符,而它所在的表達(dá)式被稱為方法引用 - 推導(dǎo)與省略
如果使用Lambda,那么根據(jù)“可推導(dǎo)就是可省略”的原則,無需指定參數(shù)類型,也無需指定的重載形式,
它們都將被自動(dòng)推導(dǎo)
如果使用方法引用,也是同樣可以根據(jù)上下文進(jìn)行推導(dǎo)
方法引用是Lambda的孿生兄弟
3.3引用類方法
引用類方法,其實(shí)就是引用類的靜態(tài)方法
- 格式
類名::靜態(tài)方法 - 范例
Integer::parseInt
Integer類的方法:public static int parseInt(String s) 將此String轉(zhuǎn)換為int類型數(shù)據(jù) - 練習(xí)描述
定義一個(gè)接口(Converter),里面定義一個(gè)抽象方法 int convert(String s);
定義一個(gè)測(cè)試類(ConverterDemo),在測(cè)試類中提供兩個(gè)方法
?一個(gè)方法是:useConverter(Converter c)
?一個(gè)方法是主方法,在主方法中調(diào)用useConverter方法 - 代碼演示
- 使用說明
Lambda表達(dá)式被類方法替代的時(shí)候,它的形式參數(shù)全部傳遞給靜態(tài)方法作為參數(shù)
3.4引用對(duì)象的實(shí)例方法
引用對(duì)象的實(shí)例方法,其實(shí)就引用類中的成員方法
- 格式
對(duì)象::成員方法 - 范例
“HelloWorld”::toUpperCase
String類中的方法:public String toUpperCase() 將此String所有字符轉(zhuǎn)換為大寫 - 練習(xí)描述
定義一個(gè)類(PrintString),里面定義一個(gè)方法
? public void printUpper(String s):把字符串參數(shù)變成大寫的數(shù)據(jù),然后在控制臺(tái)輸出
定義一個(gè)接口(Printer),里面定義一個(gè)抽象方法
? void printUpperCase(String s)
定義一個(gè)測(cè)試類(PrinterDemo),在測(cè)試類中提供兩個(gè)方法
? 一個(gè)方法是:usePrinter(Printer p)
? 一個(gè)方法是主方法,在主方法中調(diào)用usePrinter方法 - 代碼演示
- 使用說明
Lambda表達(dá)式被對(duì)象的實(shí)例方法替代的時(shí)候,它的形式參數(shù)全部傳遞給該方法作為參數(shù)
3.5引用類的實(shí)例方法
引用類的實(shí)例方法,其實(shí)就是引用類中的成員方法
- 格式
類名::成員方法 - 范例
String::substring
public String substring(int beginIndex,int endIndex)
從beginIndex開始到endIndex結(jié)束,截取字符串。返回一個(gè)子串,子串的長度為endIndex-beginIndex - 練習(xí)描述
定義一個(gè)接口(MyString),里面定義一個(gè)抽象方法:
?? String mySubString(String s,int x,int y);
定義一個(gè)測(cè)試類(MyStringDemo),在測(cè)試類中提供兩個(gè)方法
??一個(gè)方法是:useMyString(MyString my)
??一個(gè)方法是主方法,在主方法中調(diào)用useMyString方法 - 代碼演示
- 使用說明
Lambda表達(dá)式被類的實(shí)例方法替代的時(shí)候 第一個(gè)參數(shù)作為調(diào)用者 后面的參數(shù)全部傳遞給該方法作為參數(shù)
3.6引用構(gòu)造器【應(yīng)用】
引用構(gòu)造器,其實(shí)就是引用構(gòu)造方法
- l格式
類名::new - 范例
Student::new - 練習(xí)描述
定義一個(gè)類(Student),里面有兩個(gè)成員變量(name,age)
??并提供無參構(gòu)造方法和帶參構(gòu)造方法,以及成員變量對(duì)應(yīng)的get和set方法
定義一個(gè)接口(StudentBuilder),里面定義一個(gè)抽象方法
??Student build(String name,int age);
定義一個(gè)測(cè)試類(StudentDemo),在測(cè)試類中提供兩個(gè)方法
??一個(gè)方法是:useStudentBuilder(StudentBuilder s)
??一個(gè)方法是主方法,在主方法中調(diào)用useStudentBuilder方法 - 代碼演示
- 使用說明
Lambda表達(dá)式被構(gòu)造器替代的時(shí)候,它的形式參數(shù)全部傳遞給構(gòu)造器作為參數(shù)
總結(jié)
以上是生活随笔為你收集整理的Java基础day22的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口文档生成工具Swagger2的使用
- 下一篇: Java基础day23