Java中Lambda表達(dá)式的進(jìn)化之路詳解
Lambda表達(dá)式的進(jìn)化之路
為什么要使用Lambda表達(dá)式
- 可以簡(jiǎn)潔代碼,提高代碼的可讀性
- 可以避免匿名內(nèi)部類(lèi)定義過(guò)多導(dǎo)致邏輯紊亂
- 在原先實(shí)現(xiàn)接口抽象方法的時(shí)候,需要通過(guò)定義一個(gè)實(shí)現(xiàn)接口的外部類(lèi)來(lái)實(shí)現(xiàn),后面變?yōu)槎x內(nèi)部靜態(tài)類(lèi),然后變?yōu)橛镁植績(jī)?nèi)部類(lèi)實(shí)現(xiàn),再后面變成了定義匿名內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),最后的最后,為了代碼的更加簡(jiǎn)潔,推出了Lambda表達(dá)式,最終實(shí)現(xiàn)了用一行代碼完成之前多行代碼的效果
Lambda表達(dá)式的注意點(diǎn)
- Lambda表達(dá)式實(shí)際上屬于是函數(shù)式編程的概念,所以在使用的時(shí)候要知道是否屬于函數(shù)式編程
- Lambda表達(dá)式的實(shí)現(xiàn)依賴(lài)于接口和父類(lèi),所以必須有兩者之一才能實(shí)現(xiàn)Lam表達(dá)式
- Lambda表達(dá)式實(shí)現(xiàn)的接口中要求只有一個(gè)抽象方法,如果有多個(gè)抽象方法就無(wú)法使用Lambda表達(dá)式來(lái)編程
- Lambda表達(dá)式即適用于無(wú)參方法,也適用于含參方法
- Lambda表達(dá)式最早在JDK 8中開(kāi)始出現(xiàn),所以只有 JDK 8 以后的版本才支持
下面是Lambda表達(dá)式的實(shí)現(xiàn)過(guò)程
1.最開(kāi)始使用的是定義外部實(shí)現(xiàn)類(lèi)來(lái)完成接口
public class tt1 {
public static void main(String[] args) {
//用外部類(lèi)來(lái)實(shí)現(xiàn)接口,首先需要在主類(lèi)外定義另外一個(gè)類(lèi),之后再在內(nèi)部類(lèi)中創(chuàng)建對(duì)象
//這樣對(duì)于那些只需要使用一次的接口來(lái)說(shuō)比較的麻煩,而且也會(huì)使整個(gè)代碼變得臃腫,給其他開(kāi)發(fā)人員帶來(lái)閱讀困難
lover l1 = new lover();
l1.love();
}
}
//定義接口
interface ILove {
void love();
}
//外部實(shí)現(xiàn)類(lèi)
class lover implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
}
//輸出為:I love you lover ---> 1
2.開(kāi)始使用靜態(tài)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)
public class tt1 {
//靜態(tài)內(nèi)部類(lèi)
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
}
public static void main(String[] args) {
//用外部類(lèi)來(lái)實(shí)現(xiàn)接口,首先需要在主類(lèi)外定義另外一個(gè)類(lèi),之后再在內(nèi)部類(lèi)中創(chuàng)建對(duì)象
//這樣對(duì)于那些只需要使用一次的接口來(lái)說(shuō)比較的麻煩,而且也會(huì)使整個(gè)代碼變得臃腫,給其他開(kāi)發(fā)人員帶來(lái)閱讀困難
ILove l1 = new lover1();
l1.love();
//使用靜態(tài)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),由于實(shí)現(xiàn)類(lèi)和main方法位于相同主類(lèi)中,方便了開(kāi)發(fā)人員閱讀,但是實(shí)現(xiàn)過(guò)程還是比較麻煩
ILove l2 = new lover2();
l2.love();
}
}
//定義一個(gè)函數(shù)式接口
interface ILove {
void love();
}
//外部實(shí)現(xiàn)類(lèi)
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
}
//輸出為:I love you my lover ---> 1
// I love you my lover ---> 2
3.使用局部?jī)?nèi)部類(lèi)使用
public class tt1 {
//靜態(tài)內(nèi)部類(lèi)
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
}
public static void main(String[] args) {
//用外部類(lèi)來(lái)實(shí)現(xiàn)接口,首先需要在主類(lèi)外定義另外一個(gè)類(lèi),之后再在內(nèi)部類(lèi)中創(chuàng)建對(duì)象
//這樣對(duì)于那些只需要使用一次的接口來(lái)說(shuō)比較的麻煩,而且也會(huì)使整個(gè)代碼變得臃腫,給其他開(kāi)發(fā)人員帶來(lái)閱讀困難
ILove l1 = new lover1();
l1.love();
//使用靜態(tài)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),由于實(shí)現(xiàn)類(lèi)和main方法位于相同主類(lèi)中,方便了開(kāi)發(fā)人員閱讀,但是實(shí)現(xiàn)過(guò)程還是比較麻煩
ILove l2 = new lover2();
l2.love();
//局部?jī)?nèi)部類(lèi)
class lover3 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 3");
}
}
ILove l3 = new lover3();
l3.love();
}
}
//定義一個(gè)函數(shù)式接口
interface ILove {
void love();
}
//外部實(shí)現(xiàn)類(lèi)
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
}
//輸出為:I love you my lover ---> 1
// I love you my lover ---> 2
// I love you my lover ---> 3
4.使用匿名內(nèi)部類(lèi)實(shí)現(xiàn)接口
public class tt1 {
//靜態(tài)內(nèi)部類(lèi)
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
}
public static void main(String[] args) {
//用外部類(lèi)來(lái)實(shí)現(xiàn)接口,首先需要在主類(lèi)外定義另外一個(gè)類(lèi),之后再在內(nèi)部類(lèi)中創(chuàng)建對(duì)象
//這樣對(duì)于那些只需要使用一次的接口來(lái)說(shuō)比較的麻煩,而且也會(huì)使整個(gè)代碼變得臃腫,給其他開(kāi)發(fā)人員帶來(lái)閱讀困難
ILove l1 = new lover1();
l1.love();
//使用靜態(tài)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),由于實(shí)現(xiàn)類(lèi)和main方法位于相同主類(lèi)中,方便了開(kāi)發(fā)人員閱讀,但是實(shí)現(xiàn)過(guò)程還是比較麻煩
ILove l2 = new lover2();
l2.love();
//局部?jī)?nèi)部類(lèi)
class lover3 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 3");
}
}
ILove l3 = new lover3();
l3.love();
//使用內(nèi)部匿名類(lèi)
ILove l4 = new ILove() {
@Override
public void love() {
System.out.println("I love you my lover ---> 4");
}
};
}
}
//定義一個(gè)函數(shù)式接口
interface ILove {
void love();
}
//外部實(shí)現(xiàn)類(lèi)
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
}
//輸出為:I love you my lover ---> 1
// I love you my lover ---> 2
// I love you my lover ---> 3
// I love you my lover ---> 4
5..最后使用Lambda表達(dá)式實(shí)現(xiàn)函數(shù)式接口
public class tt1 {
//靜態(tài)內(nèi)部類(lèi)
static class lover2 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 2");
}
}
public static void main(String[] args) {
//用外部類(lèi)來(lái)實(shí)現(xiàn)接口,首先需要在主類(lèi)外定義另外一個(gè)類(lèi),之后再在內(nèi)部類(lèi)中創(chuàng)建對(duì)象
//這樣對(duì)于那些只需要使用一次的接口來(lái)說(shuō)比較的麻煩,而且也會(huì)使整個(gè)代碼變得臃腫,給其他開(kāi)發(fā)人員帶來(lái)閱讀困難
ILove l1 = new lover1();
l1.love();
//使用靜態(tài)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn),由于實(shí)現(xiàn)類(lèi)和main方法位于相同主類(lèi)中,方便了開(kāi)發(fā)人員閱讀,但是實(shí)現(xiàn)過(guò)程還是比較麻煩
ILove l2 = new lover2();
l2.love();
//局部?jī)?nèi)部類(lèi)
class lover3 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 3");
}
}
ILove l3 = new lover3();
l3.love();
//使用內(nèi)部匿名類(lèi)
ILove l4 = new ILove() {
@Override
public void love() {
System.out.println("I love you my lover ---> 4");
}
};
l4.love();
//使用Lambda表達(dá)式實(shí)現(xiàn)接口
ILove l5 = () ->{
System.out.println("I love you my lover ---> 5");
};
l5.love();
}
}
//定義一個(gè)函數(shù)式接口
interface ILove {
void love();
}
//外部實(shí)現(xiàn)類(lèi)
class lover1 implements ILove{
@Override
public void love() {
System.out.println("I love you my lover ---> 1");
}
}
//輸出為:
I love you my lover ---> 1
I love you my lover ---> 2
I love you my lover ---> 3
I love you my lover ---> 4
I love you my lover ---> 5
關(guān)于Lambda表達(dá)式的更加極致的簡(jiǎn)化(針對(duì)有參數(shù)的Lambda表達(dá)書(shū))
- 簡(jiǎn)化數(shù)據(jù)類(lèi)型 在Lambda表達(dá)式中可以將參數(shù)的數(shù)據(jù)類(lèi)型省略,只留下一個(gè)數(shù)據(jù)名稱(chēng)。比較特殊的是如果有多個(gè)參數(shù),省略的時(shí)候應(yīng)該將所有參數(shù)的數(shù)據(jù)類(lèi)型都省略,不然就全部不省略,而且需要用括號(hào)將參數(shù)包含在內(nèi)。
- 省略括號(hào) 參照上一條,只有一個(gè)參數(shù)要求的時(shí)候才可以省略括號(hào)省略花括號(hào)
- 在Lambda表達(dá)式中,只有當(dāng)輸出語(yǔ)句或者代碼只有一行的時(shí)候可以省略花括號(hào)。假如有多條執(zhí)行代碼,還是需要用花括號(hào)將代碼包含在內(nèi)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JAVA實(shí)戰(zhàn)練習(xí)之圖書(shū)管理系統(tǒng)實(shí)現(xiàn)流程
隨著網(wǎng)絡(luò)技術(shù)的高速發(fā)展,計(jì)算機(jī)應(yīng)用的普及,利用計(jì)算機(jī)對(duì)圖書(shū)館的日常工作進(jìn)行管理勢(shì)在必行,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)圖書(shū)管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平2021-10-10
Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離
這篇文章主要介紹了Java實(shí)現(xiàn)控制臺(tái)輸出兩點(diǎn)間距離,涉及了部分編程坐標(biāo)的問(wèn)題,具有一定參考價(jià)值,需要的朋友可以了解下2017-09-09
SpringBoot無(wú)法訪問(wèn)/static下靜態(tài)資源的解決
這篇文章主要介紹了SpringBoot無(wú)法訪問(wèn)/static下靜態(tài)資源的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
SpringMVC使用注解實(shí)現(xiàn)登錄功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC使用注解實(shí)現(xiàn)登錄功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09
微服務(wù)Spring?Boot?整合Redis?阻塞隊(duì)列實(shí)現(xiàn)異步秒殺下單思路詳解
這篇文章主要介紹了微服務(wù)Spring?Boot?整合Redis?阻塞隊(duì)列實(shí)現(xiàn)異步秒殺下單,使用阻塞隊(duì)列實(shí)現(xiàn)秒殺的優(yōu)化,采用異步秒殺完成下單的優(yōu)化,本文給大家分享詳細(xì)步驟及實(shí)現(xiàn)思路,需要的朋友可以參考下2022-10-10
Java多線程并發(fā)執(zhí)行demo代碼實(shí)例
這篇文章主要介紹了Java多線程并發(fā)執(zhí)行demo代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
java?-jar/-cp啟動(dòng)添加外部的依賴(lài)包方式
這篇文章主要介紹了java?-jar/-cp啟動(dòng)添加外部的依賴(lài)包方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

