推薦答案
匿名內(nei)部類和lambda表達式都可以用(yong)來實現一個函數接口(Functional Interface)的實例,它(ta)們的主要(yao)區別如(ru)下:
1. 語法形式:匿名內部(bu)類(lei)是(shi)java的一(yi)種(zhong)特性(xing),語法(fa)形式比較冗長,需要(yao)使用(yong)關(guan)鍵(jian)字、大括號、分(fen)號等,使用(yong)起(qi)來稍(shao)顯繁瑣。而lambda表達式是(shi)從JDK8開始引入的,語法(fa)簡單,可以看作是(shi)對匿名內部(bu)類(lei)的一(yi)種(zhong)簡化和優(you)化。
2. 對上下文變量的捕獲:匿(ni)名(ming)內部類(lei)中可以訪問外(wai)部類(lei)的(de)成(cheng)員變(bian)量、方法參數和本地變(bian)量,它們的(de)值都可以在匿(ni)名(ming)內部類(lei)中被修(xiu)改。而lambda表達式中只(zhi)能捕獲(huo)最終變(bian)量或(huo)者(zhe)是事實上的(de)最終變(bian)量(final或(huo)者(zhe)等價于final),也就是只(zhi)能讀取外(wai)部變(bian)量,不(bu)能修(xiu)改。如果需要(yao)修(xiu)改則(ze)使用會報編譯(yi)錯誤。
3. 類型推導和函數接口:在使(shi)用lambda表(biao)達式時,JDK8可(ke)以推(tui)導出(chu)lambda表(biao)達式的參數(shu)類(lei)(lei)型(xing)和返回類(lei)(lei)型(xing)。因此(ci),使(shi)用lambda表(biao)達式時不(bu)需要(yao)顯(xian)示聲明(ming)類(lei)(lei)型(xing)。而匿名(ming)內部類(lei)(lei)需要(yao)顯(xian)式地聲明(ming)接口和類(lei)(lei)類(lei)(lei)型(xing)。
4. 代碼量:lambda表達式的語(yu)法更加(jia)精(jing)簡,代碼量相對較小,而(er)且可讀性更強,降低了(le)程(cheng)序員(yuan)的輸入(ru)疲勞度(du)。而(er)匿名內部類(lei)語(yu)法冗(rong)長,代碼量較大。
總之,lambda表(biao)達式(shi)是(shi)一(yi)(yi)種更為優雅簡潔的(de)編程方(fang)式(shi),而匿(ni)名內部類則(ze)依(yi)舊存(cun)在(zai)一(yi)(yi)定的(de)應用場(chang)景,例如需要訪問外部類的(de)成員(yuan)變(bian)量,或者需要實(shi)現一(yi)(yi)些非函數接(jie)口的(de)抽象方(fang)法等。
其他答案
-
匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)和(he)(he) Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)都是在(zai)(zai)(zai)(zai) Java 中用(yong)(yong)于實現(xian)(xian)函(han)(han)數式(shi)(shi)(shi)(shi)(shi)(shi)編程(cheng)(cheng)的(de)(de)機制,但它們在(zai)(zai)(zai)(zai)語(yu)法(fa)(fa)(fa)(fa)和(he)(he)使(shi)用(yong)(yong)上(shang)有一些(xie)區別。1. 語(yu)法(fa)(fa)(fa)(fa):匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)使(shi)用(yong)(yong)關(guan)鍵(jian)字 `new` 創建(jian)(jian)一個(ge)實現(xian)(xian)特定(ding)接(jie)(jie)口或抽(chou)象(xiang)類(lei)(lei)(lei)(lei)(lei)的(de)(de)匿(ni)(ni)(ni)名(ming)(ming)(ming)類(lei)(lei)(lei)(lei)(lei),并在(zai)(zai)(zai)(zai)大括號(hao)(hao)中實現(xian)(xian)其方(fang)(fang)法(fa)(fa)(fa)(fa)。Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)使(shi)用(yong)(yong)箭(jian)頭 `->` 分隔參(can)數列表(biao)和(he)(he)方(fang)(fang)法(fa)(fa)(fa)(fa)體,可(ke)(ke)以(yi)直接(jie)(jie)表(biao)示一個(ge)函(han)(han)數。2. 類(lei)(lei)(lei)(lei)(lei)型(xing)推斷(duan):匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)在(zai)(zai)(zai)(zai)創建(jian)(jian)時需(xu)要(yao)顯式(shi)(shi)(shi)(shi)(shi)(shi)指定(ding)接(jie)(jie)口或抽(chou)象(xiang)類(lei)(lei)(lei)(lei)(lei)的(de)(de)類(lei)(lei)(lei)(lei)(lei)型(xing),編譯(yi)器通過類(lei)(lei)(lei)(lei)(lei)型(xing)推斷(duan)來確定(ding)匿(ni)(ni)(ni)名(ming)(ming)(ming)類(lei)(lei)(lei)(lei)(lei)的(de)(de)類(lei)(lei)(lei)(lei)(lei)型(xing)。Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)可(ke)(ke)以(yi)根據上(shang)下(xia)文推斷(duan)出參(can)數的(de)(de)類(lei)(lei)(lei)(lei)(lei)型(xing),無(wu)需(xu)顯式(shi)(shi)(shi)(shi)(shi)(shi)指定(ding)。3. 簡(jian)潔性:Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)相(xiang)比匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)更加(jia)簡(jian)潔,可(ke)(ke)以(yi)省略方(fang)(fang)法(fa)(fa)(fa)(fa)參(can)數的(de)(de)類(lei)(lei)(lei)(lei)(lei)型(xing)和(he)(he)大括號(hao)(hao)內(nei)(nei)的(de)(de)冗余(yu)代(dai)碼(ma)(ma),使(shi)代(dai)碼(ma)(ma)更加(jia)精(jing)煉(lian)和(he)(he)易讀。4. 作用(yong)(yong)域:匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)可(ke)(ke)以(yi)引(yin)用(yong)(yong)外(wai)部(bu)類(lei)(lei)(lei)(lei)(lei)的(de)(de)成員變量(liang)和(he)(he)方(fang)(fang)法(fa)(fa)(fa)(fa),而(er) Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)只能引(yin)用(yong)(yong) final 或 effectively final 的(de)(de)變量(liang)。5. 實例(li)(li)化方(fang)(fang)式(shi)(shi)(shi)(shi)(shi)(shi):匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)使(shi)用(yong)(yong) `new` 關(guan)鍵(jian)字實例(li)(li)化,每次實例(li)(li)化都會創建(jian)(jian)一個(ge)新的(de)(de)對象(xiang)。Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)是函(han)(han)數式(shi)(shi)(shi)(shi)(shi)(shi)接(jie)(jie)口的(de)(de)實例(li)(li),它們在(zai)(zai)(zai)(zai)運行時被轉化為函(han)(han)數式(shi)(shi)(shi)(shi)(shi)(shi)接(jie)(jie)口的(de)(de)實現(xian)(xian)實例(li)(li)。總體而(er)言,Lambda 表(biao)達(da)(da)(da)(da)式(shi)(shi)(shi)(shi)(shi)(shi)相(xiang)比匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)更加(jia)簡(jian)潔、靈(ling)活,并且可(ke)(ke)以(yi)利用(yong)(yong) Java 8 引(yin)入的(de)(de)函(han)(han)數式(shi)(shi)(shi)(shi)(shi)(shi)接(jie)(jie)口來實現(xian)(xian)函(han)(han)數式(shi)(shi)(shi)(shi)(shi)(shi)編程(cheng)(cheng)。但在(zai)(zai)(zai)(zai)一些(xie)復雜(za)的(de)(de)場景下(xia),匿(ni)(ni)(ni)名(ming)(ming)(ming)內(nei)(nei)部(bu)類(lei)(lei)(lei)(lei)(lei)仍然(ran)有其用(yong)(yong)武之地,例(li)(li)如需(xu)要(yao)引(yin)用(yong)(yong)外(wai)部(bu)類(lei)(lei)(lei)(lei)(lei)的(de)(de)成員變量(liang)或方(fang)(fang)法(fa)(fa)(fa)(fa),或需(xu)要(yao)實現(xian)(xian)多(duo)個(ge)方(fang)(fang)法(fa)(fa)(fa)(fa)的(de)(de)情況。選擇使(shi)用(yong)(yong)哪種(zhong)方(fang)(fang)式(shi)(shi)(shi)(shi)(shi)(shi)取決于具體的(de)(de)需(xu)求和(he)(he)編程(cheng)(cheng)風格。
-
匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)和(he)(he)(he)lambda表(biao)達(da)式(shi)(shi)(shi)都是(shi)(shi)Java中(zhong)的(de)(de)(de)(de)(de)(de)(de)復(fu)(fu)雜語(yu)法結構(gou)(gou),主要(yao)(yao)是(shi)(shi)用(yong)來(lai)(lai)(lai)(lai)定義(yi)函(han)(han)數(shu)(shu)(shu)接(jie)(jie)口(kou)(kou)或(huo)(huo)(huo)(huo)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)的(de)(de)(de)(de)(de)(de)(de)實(shi)現(xian)(xian)。但(dan)是(shi)(shi),這兩種結構(gou)(gou)在(zai)(zai)(zai)使(shi)用(yong)和(he)(he)(he)實(shi)現(xian)(xian)上存(cun)(cun)在(zai)(zai)(zai)一(yi)些(xie)顯著的(de)(de)(de)(de)(de)(de)(de)區(qu)別(bie)。首先,匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)和(he)(he)(he)lambda表(biao)達(da)式(shi)(shi)(shi)都可(ke)(ke)(ke)(ke)以(yi)用(yong)來(lai)(lai)(lai)(lai)實(shi)現(xian)(xian)抽(chou)象(xiang)(xiang)(xiang)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)或(huo)(huo)(huo)(huo)接(jie)(jie)口(kou)(kou)。在(zai)(zai)(zai)使(shi)用(yong)匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)時,需要(yao)(yao)通(tong)過實(shi)現(xian)(xian)接(jie)(jie)口(kou)(kou)或(huo)(huo)(huo)(huo)繼(ji)承抽(chou)象(xiang)(xiang)(xiang)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)來(lai)(lai)(lai)(lai)定義(yi)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)的(de)(de)(de)(de)(de)(de)(de)實(shi)現(xian)(xian),并且(qie)(qie)必須使(shi)用(yong)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)的(de)(de)(de)(de)(de)(de)(de)構(gou)(gou)造(zao)函(han)(han)數(shu)(shu)(shu)來(lai)(lai)(lai)(lai)創建對(dui)(dui)象(xiang)(xiang)(xiang)實(shi)例(li)。而lambda表(biao)達(da)式(shi)(shi)(shi)則(ze)不需要(yao)(yao)實(shi)現(xian)(xian)接(jie)(jie)口(kou)(kou)或(huo)(huo)(huo)(huo)繼(ji)承抽(chou)象(xiang)(xiang)(xiang)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei),可(ke)(ke)(ke)(ke)以(yi)直(zhi)接(jie)(jie)定義(yi)函(han)(han)數(shu)(shu)(shu)接(jie)(jie)口(kou)(kou)的(de)(de)(de)(de)(de)(de)(de)實(shi)現(xian)(xian),并且(qie)(qie)在(zai)(zai)(zai)使(shi)用(yong)時可(ke)(ke)(ke)(ke)以(yi)直(zhi)接(jie)(jie)通(tong)過該表(biao)達(da)式(shi)(shi)(shi)創建對(dui)(dui)象(xiang)(xiang)(xiang)實(shi)例(li)。其次,匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)和(he)(he)(he)lambda表(biao)達(da)式(shi)(shi)(shi)的(de)(de)(de)(de)(de)(de)(de)語(yu)法結構(gou)(gou)也存(cun)(cun)在(zai)(zai)(zai)一(yi)些(xie)不同。匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)是(shi)(shi)在(zai)(zai)(zai)定義(yi)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)的(de)(de)(de)(de)(de)(de)(de)同時創建對(dui)(dui)象(xiang)(xiang)(xiang)實(shi)例(li),將類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)的(de)(de)(de)(de)(de)(de)(de)構(gou)(gou)造(zao)函(han)(han)數(shu)(shu)(shu)和(he)(he)(he)實(shi)例(li)化代(dai)(dai)(dai)(dai)碼(ma)合并在(zai)(zai)(zai)一(yi)起。而lambda表(biao)達(da)式(shi)(shi)(shi)則(ze)是(shi)(shi)通(tong)過符號“->”將參(can)數(shu)(shu)(shu)和(he)(he)(he)函(han)(han)數(shu)(shu)(shu)體(ti)分(fen)隔開(kai)來(lai)(lai)(lai)(lai),來(lai)(lai)(lai)(lai)定義(yi)函(han)(han)數(shu)(shu)(shu)接(jie)(jie)口(kou)(kou)的(de)(de)(de)(de)(de)(de)(de)實(shi)現(xian)(xian)。另外,匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)和(he)(he)(he)lambda表(biao)達(da)式(shi)(shi)(shi)在(zai)(zai)(zai)代(dai)(dai)(dai)(dai)碼(ma)的(de)(de)(de)(de)(de)(de)(de)可(ke)(ke)(ke)(ke)讀(du)性(xing)和(he)(he)(he)簡(jian)(jian)潔(jie)性(xing)上也存(cun)(cun)在(zai)(zai)(zai)很(hen)大(da)的(de)(de)(de)(de)(de)(de)(de)差異。雖(sui)然匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)可(ke)(ke)(ke)(ke)以(yi)很(hen)好(hao)地(di)封裝代(dai)(dai)(dai)(dai)碼(ma),但(dan)是(shi)(shi)由于其語(yu)法結構(gou)(gou)較(jiao)為復(fu)(fu)雜,在(zai)(zai)(zai)編(bian)寫和(he)(he)(he)閱讀(du)時可(ke)(ke)(ke)(ke)能(neng)會導致代(dai)(dai)(dai)(dai)碼(ma)的(de)(de)(de)(de)(de)(de)(de)可(ke)(ke)(ke)(ke)讀(du)性(xing)降低(di)。而lambda表(biao)達(da)式(shi)(shi)(shi)則(ze)使(shi)用(yong)較(jiao)為簡(jian)(jian)潔(jie)的(de)(de)(de)(de)(de)(de)(de)語(yu)法結構(gou)(gou),并且(qie)(qie)不需要(yao)(yao)創建額外的(de)(de)(de)(de)(de)(de)(de)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)或(huo)(huo)(huo)(huo)對(dui)(dui)象(xiang)(xiang)(xiang),可(ke)(ke)(ke)(ke)以(yi)提高代(dai)(dai)(dai)(dai)碼(ma)的(de)(de)(de)(de)(de)(de)(de)可(ke)(ke)(ke)(ke)讀(du)性(xing)和(he)(he)(he)簡(jian)(jian)潔(jie)性(xing)。最后(hou), 匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)和(he)(he)(he)lambda表(biao)達(da)式(shi)(shi)(shi)也存(cun)(cun)在(zai)(zai)(zai)一(yi)些(xie)適用(yong)的(de)(de)(de)(de)(de)(de)(de)場景上的(de)(de)(de)(de)(de)(de)(de)區(qu)別(bie)。匿(ni)(ni)(ni)名(ming)(ming)內(nei)(nei)部(bu)(bu)類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)適用(yong)于需要(yao)(yao)實(shi)現(xian)(xian)多個接(jie)(jie)口(kou)(kou)或(huo)(huo)(huo)(huo)重(zhong)復(fu)(fu)定義(yi)某個類(lei)(lei)(lei)(lei)(lei)(lei)(lei)(lei)時使(shi)用(yong)。而lambda表(biao)達(da)式(shi)(shi)(shi)則(ze)主要(yao)(yao)用(yong)于實(shi)現(xian)(xian)單一(yi)的(de)(de)(de)(de)(de)(de)(de)函(han)(han)數(shu)(shu)(shu)接(jie)(jie)口(kou)(kou),并且(qie)(qie)可(ke)(ke)(ke)(ke)以(yi)方便地(di)進行函(han)(han)數(shu)(shu)(shu)式(shi)(shi)(shi)編(bian)程。

熱問標簽 更多>>
人氣閱(yue)讀(du)
大家(jia)都在問 更多>>
java合并(bing)兩個數組并(bing)升序排列怎么...
java合(he)并兩(liang)個數組并排序怎么(me)操(cao)作
java多行字(zi)符串(chuan)輸入怎(zen)么操(cao)作