網(wǎng)站首頁 編程語言 正文
文章目錄
- 一、匿名內(nèi)部類
- 1. 語法格式
- 2. 使用方法
- ① 傳統(tǒng)方式
- ② 匿名內(nèi)部類方式
- 二、Lambda表達(dá)式
- 1. 語法格式
- 2. 使用方法
- ① 匿名內(nèi)部類方式
- ② Lambda表達(dá)式方式
- 三、方法引用
- 1. 語法格式
- 2. 使用方法
- ① 類型的靜態(tài)方法引用
- ② 類型的構(gòu)造方法引用
- ③ 類型的實例方法引用
- ④ 對象的實例方法引用
- 四、匿名內(nèi)部類、Lambda表達(dá)式、方法引用對比分析總結(jié)
一、匿名內(nèi)部類
匿名內(nèi)部類可以看作是特殊的局部內(nèi)部類,其本質(zhì)就是一個繼承類(或?qū)崿F(xiàn)接口)的匿名子類。
匿名內(nèi)部類是在使用的時候動態(tài)的指定方法體的邏輯,無需每次都去創(chuàng)建一個繼承類(或?qū)崿F(xiàn)接口)的子類。編譯器會在編譯階段自動生成一個匿名子類。
1. 語法格式
匿名內(nèi)部類的語法格式:new 接口名|類名(){重寫方法}
其中,如果重寫方法為非必要的,原則上是可以沒有重寫方法部分的。
2. 使用方法
① 傳統(tǒng)方式
父子類:
public class ParentClass {
public void aa(String str) {
}
public void bb(String str) {
}
}
public class ChildClass extends ParentClass {
@Override
public void aa(String str) {
System.out.println("自定義方法體");
}
@Override
public void bb(String str) {
System.out.println("自定義方法體");
}
}
public class Test {
public static void main(String[] args) {
ParentClass ohj = new ChildClass();
}
}
接口實現(xiàn)類:
public interface ParentInterface {
void aa(String str);
void bb(String str);
}
public class ChildClass implements ParentInterface {
@Override
public void aa(String str) {
System.out.println("自定義方法體");
}
@Override
public void bb(String str) {
System.out.println("自定義方法體");
}
}
public class Test {
public static void main(String[] args) {
ParentInterface ohj = new ChildClass();
}
}
② 匿名內(nèi)部類方式
父子類:
public class ParentClass {
public void aa(String str) {
}
public void bb(String str) {
}
}
public class Test {
public static void main(String[] args) {
ParentClass obj = new ParentClass() {
@Override
public void aa() {
System.out.println("自定義方法體");
}
@Override
public void bb() {
System.out.println("自定義方法體");
}
};
}
}
接口實現(xiàn)類:
public interface ParentInterface {
void aa(String str);
void bb(String str);
}
public class Test {
public static void main(String[] args) {
ParentInterface obj = new ParentInterface() {
@Override
public void aa() {
System.out.println("自定義方法體");
}
@Override
public void bb() {
System.out.println("自定義方法體");
}
};
}
}
二、Lambda表達(dá)式
從Java8開始,引入了Lambda表達(dá)式。
對于只有一個抽象方法的接口(函數(shù)式接口),可以直接使用Lambda表達(dá)式創(chuàng)建它的匿名實現(xiàn)類實例。
- 使用匿名內(nèi)部類方式定義的內(nèi)部類:編譯之后,會生成一個單獨(dú)的class字節(jié)碼文件(外部類名$編號.class);
- 使用Lambda表達(dá)式定義的內(nèi)部類:編譯之后,不會生成一個單獨(dú)的class字節(jié)碼文件,對應(yīng)的字節(jié)碼會在運(yùn)行的時候動態(tài)生成。
1. 語法格式
Lambda表達(dá)式的語法格式:(參數(shù)列表) -> {方法體}
省略寫法:
- 小括號內(nèi)參數(shù)的參數(shù)類型可以省略
- 小括號內(nèi)無參數(shù)時,小括號不可省略
- 小括號內(nèi)只有一個參數(shù)時,小括號可以省略
- 小括號內(nèi)有多個參數(shù)時,小括號不可省略
- 大括號內(nèi)有且只有一行語句時,可以省略
2. 使用方法
public interface ParentInterface {
void aa(String str);
}
① 匿名內(nèi)部類方式
public class Test {
public static void main(String[] args) {
ParentInterface obj = new ParentInterface() {
@Override
public void aa(String str) {
System.out.println("自定義方法體");
}
};
}
}
② Lambda表達(dá)式方式
public class Test {
public static void main(String[] args) {
ParentInterface obj = str -> System.out.println("自定義方法體");
}
}
三、方法引用
方法引用是對Lambda表達(dá)式進(jìn)一步簡化,借用其他類的方法體,省去了寫方法體的過程。
對于方法體只有一行代碼的Lambda表達(dá)式(該行代碼為調(diào)用某個類或某個實例的方法時),可以簡潔為更簡單的方法引用的方式。
1. 語法格式
方法引用的語法格式:
語法種類 | 語法格式 | 示例 | 參數(shù)對應(yīng)關(guān)系 |
---|---|---|---|
類型的靜態(tài)方法引用 | 類::靜態(tài)方法 | String::valueOf | 抽象方法的參數(shù)與靜態(tài)方法的參數(shù)順序?qū)?yīng) |
類型的構(gòu)造方法引用 | 類::new | String::new | 抽象方法的參數(shù)與構(gòu)造方法的參數(shù)順序?qū)?yīng) |
類型的實例方法引用 | 類::實例方法 | String::replaceAll | 抽象方法的第一個參數(shù)為調(diào)用引用方法的實例對象 抽象方法的剩余參數(shù)與實例方法的參數(shù)順序?qū)?yīng) |
對象的實例方法引用 | 對象::實例方法 | s::replaceAll | 實例對象s為外部參數(shù) 抽象方法的參數(shù)與實例方法的參數(shù)順序?qū)?yīng) |
需要注意:
- 當(dāng)接口的抽象方法無返回值時,方法引用的方法有無返回值都可以;
- 當(dāng)接口的抽象方法有返回值時,方法引用的方法也必須有返回值,且返回值類型 instanceof 接口的抽象方法返回值類型
2. 使用方法
① 類型的靜態(tài)方法引用
類型的靜態(tài)方法引用:類名::靜態(tài)方法
對應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> 類名.靜態(tài)方法(參數(shù)1,參數(shù)2,…)
@FunctionalInterface
public interface ParentInterface {
String aa(String s);
}
public class Test {
public static void main(String[] args) {
// 類型的靜態(tài)方法引用
ParentInterface parentInterface1 = String::valueOf;
// 對應(yīng)Lambda表達(dá)式方式
ParentInterface parentInterface2 = s -> String.valueOf(s);
}
}
② 類型的構(gòu)造方法引用
類型的構(gòu)造方法引用:類::new
對應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> new 類名(參數(shù)1,參數(shù)2,…)
@FunctionalInterface
public interface ParentInterface {
String aa(String s);
}
public class Test {
public static void main(String[] args) {
// 類型的構(gòu)造方法引用
ParentInterface parentInterface1 = String::new;
// 對應(yīng)Lambda表達(dá)式方式
ParentInterface parentInterface2 = s -> new String(s);
}
}
③ 類型的實例方法引用
類型的實例方法引用:類::實例方法
對應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> 參數(shù)1.靜態(tài)方法(參數(shù)2,…)
@FunctionalInterface
public interface ParentInterface {
String aa(String s1, String s2, String s3);
}
public class Test {
public static void main(String[] args) {
// 類型的實例方法引用
ParentInterface parentInterface1 = String::replaceAll;
// 對應(yīng)Lambda表達(dá)式方式
ParentInterface parentInterface2 = (s1,s2,s3) -> s1.replaceAll(s2,s3);
}
}
④ 對象的實例方法引用
對象的實例方法引用:對象::實例方法
對應(yīng)Lambda表達(dá)式:(參數(shù)1,參數(shù)2,…) -> 對象.靜態(tài)方法(參數(shù)1,參數(shù)2,…)
@FunctionalInterface
public interface ParentInterface {
String aa(String s1, String s2);
}
public class Test {
public static void main(String[] args) {
String s = "";
// 對象的實例方法引用
ParentInterface parentInterface1 = s::replaceAll;
// 對應(yīng)Lambda表達(dá)式方式
ParentInterface parentInterface2 = (s1,s2) -> s.replaceAll(s1,s2);
}
}
四、匿名內(nèi)部類、Lambda表達(dá)式、方法引用對比分析總結(jié)
- Lambda表達(dá)式是匿名內(nèi)部類的簡寫(匿名內(nèi)部類為函數(shù)式接口的實現(xiàn)的這種)
- 方法引用是Lambda表達(dá)式的簡寫(Lambda表達(dá)式的方法體只有一行代碼且該行代碼方法調(diào)用)
原文鏈接:https://blog.csdn.net/JokerLJG/article/details/129051108
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2022-06-21 C語言超詳細(xì)講解文件的操作_C 語言
- 2022-09-29 Python組合數(shù)據(jù)類型詳解_python
- 2022-06-13 matplotlib繪制甘特圖的萬能模板案例_python
- 2022-04-20 用Python實現(xiàn)插值算法_python
- 2022-09-16 Linux?Shell如何用ssh命令統(tǒng)計分布式集群信息詳解_linux shell
- 2022-04-24 Android掛斷電話最新實現(xiàn)方法_Android
- 2022-04-28 一篇文章帶你了解C++特殊類的設(shè)計_C 語言
- 2022-05-06 如何利用Python處理excel表格中的數(shù)據(jù)_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支