摘要:函數(shù)式接口可以包含多個(gè)默認(rèn)方法類方法但只能一個(gè)抽象方法函數(shù)式接口有且只有一個(gè)沒有關(guān)鍵字修飾的接口可以多個(gè)關(guān)鍵字的抽象方法類方法變量語法組成元素形參列表。
Lambda相當(dāng)于就是一個(gè)匿名方法,其在代替匿名內(nèi)部類創(chuàng)建對(duì)象的時(shí)候,Lambda表達(dá)式代碼塊會(huì)代替實(shí)現(xiàn)抽象方法的方法體
Lambda表達(dá)式的目標(biāo)類型必須是“函數(shù)式接口(FunctionalInterface)”。函數(shù)式接口只能包含一個(gè)抽象方法接口。函數(shù)式接口可以包含多個(gè)默認(rèn)方法、類方法、但只能一個(gè)抽象方法
函數(shù)式接口有且只有一個(gè)沒有default關(guān)鍵字修飾的接口
語法組成元素可以多個(gè)default關(guān)鍵字的抽象方法、類方法、變量
形參列表。形參可以省略數(shù)據(jù)類型。若只有一個(gè)參數(shù),可以將圓括號(hào)省略
箭頭(->)
代碼塊。如果只有一條語句,Lambda表達(dá)式可以省略花括號(hào)。代碼塊只能有一條return語句,并且可以省略return關(guān)鍵字
public class Lam { @FunctionalInterface interface Try{ Integer ss(); } public static void main(String[] args) { Try i=()->"sa".indexOf("a"); System.out.println(i.ss()); } }
Lambda的代碼塊中就是用來實(shí)現(xiàn)接口的抽象方法,而且有且只能有一個(gè)。若有default關(guān)鍵字的抽象方法是不屬于函數(shù)式接口(FunctionalInterface)
存在@FunctionalInterface注解的一定是函數(shù)式接口,沒有@FunctionalInterface不一定就不是函數(shù)式接口
public class Lam { @FunctionalInterface interface Try { String s = "1"; Integer ss(); default Integer bb() { return 0; } } public static void main(String[] args) { Try i = () -> "sa".indexOf("a"); System.out.println(i.s); System.out.println(i.ss()); } }方法引用與構(gòu)造器引用
種類 | 示例 | 說明 | 對(duì)應(yīng)的Lambda表達(dá)式 |
---|---|---|---|
引用類方法 | 類名::類方法 | 函數(shù)式接口中實(shí)現(xiàn)的方法的全部參數(shù)都傳遞給類方法作為參數(shù) | (a,b,...)->類名.類方法(a,b,...) |
特定對(duì)象的實(shí)例方法 | 對(duì)象::實(shí)例方法 | 函數(shù)式接口中實(shí)現(xiàn)的方法的全部參數(shù)都傳遞給類方法作為參數(shù) | (a,b,...)->對(duì)象.實(shí)例方法(a,b,...) |
引用某類對(duì)象的實(shí)例方法 | 類名::實(shí)例方法 | 函數(shù)式接口中實(shí)現(xiàn)的方法第一個(gè)參數(shù)作為調(diào)用者,之后的參數(shù)都作為方法的參數(shù) | (a,b,...)->a.實(shí)例方法(b,...) |
引用構(gòu)造方法 | 類名::new | 函數(shù)式接口中實(shí)現(xiàn)的方法的全部參數(shù)都傳遞給類方法作為參數(shù) | (a,b,...)->類名.new(a,b,...) |
使用::這種方式,抽象方法肯定是存在參數(shù)的
其實(shí)上面三類可以歸為一類來看待,這是形式不同而已
public class Lam { @FunctionalInterface interface Try { String s = "1"; Integer ss(String s); default Integer sb() { return 0; } } public static void main(String[] args) { Try i = "sa"::indexOf; System.out.println(i.s); System.out.println(i.ss("a")); }
引用構(gòu)造方法
public class Lam { @FunctionalInterface interface Try { String s = "1"; String ss(String s); default Integer sb() { return 0; } } public static void main(String[] args) { Try i = String::new; System.out.println(i.s); System.out.println(i.ss("a")); }
等價(jià)于
public class Lam { @FunctionalInterface interface Try { String s = "1"; String ss(String s); default Integer sb() { return 0; } } public static void main(String[] args) { Try i = new Try(){ @Override public String ss(String s) { return new String(s); } }; System.out.println(i.s); System.out.println(i.ss("a")); }Lambda表達(dá)式與匿名函數(shù)的異同點(diǎn)
同
Lambda表達(dá)式與匿名內(nèi)部類一樣,都可以直接訪問“effectivly final”的局部變量,以及外部類的成員變量(包括實(shí)例變量和類變量)
Lambda表達(dá)式創(chuàng)建的對(duì)象與匿名內(nèi)部類生成的對(duì)象一樣,都可以直接調(diào)用從接口中繼承的默認(rèn)方法
異
匿名內(nèi)部類可以為任意接口創(chuàng)建實(shí)例——不管接口包含多少抽象方法,只要匿名內(nèi)部類實(shí)現(xiàn)所有的抽象方法即可;但Lambda表達(dá)式只能為函數(shù)式接口創(chuàng)建實(shí)例
匿名內(nèi)部類可以為抽象類甚至普通類創(chuàng)建實(shí)例;但Lambda表達(dá)式只能為函數(shù)式接口創(chuàng)建實(shí)例
匿名內(nèi)部類實(shí)現(xiàn)的抽象方法的方法體運(yùn)行調(diào)用接口中定義的默認(rèn)方法;但Lambda表達(dá)式的代碼塊不允許調(diào)用接口中定義的默認(rèn)方法
更多內(nèi)容可以關(guān)注微信公眾號(hào),或者訪問AppZone網(wǎng)站
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/65933.html
摘要:使用解決的數(shù)據(jù)流問題原文譯者飛龍協(xié)議在年三月發(fā)布,距離現(xiàn)在年三月五號(hào)快有一年了。除了,最實(shí)用的特性是新的數(shù)據(jù)流。是吧,注是瀏覽器上的數(shù)據(jù)流的接口,并解決了上述問題。 使用Intellij IDEA 解決Java8的數(shù)據(jù)流問題 原文:Fixing Java 8 Stream Gotchas with IntelliJ IDEA 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 ...
摘要:編寫函數(shù)編寫函數(shù)推薦使用這個(gè),控制臺(tái)中的函數(shù)編寫堪稱讓人痛不欲生。在控制臺(tái)中安裝在中引入包后會(huì)一起打包上傳到運(yùn)行時(shí)中。 Amazon Web Services(AWS) 雖然作為市場(chǎng)份額全球第一的云計(jì)算廠商,其產(chǎn)品也不是完美無缺的,Cognito (AWS 的身份認(rèn)證解決方案)及其附帶的中文文檔就是一個(gè)反面教材,其難用程度令人發(fā)指。當(dāng)然,除了不易用之外,還有訪問速度緩慢,不適用于中國市...
摘要:之前,使用匿名類給蘋果排序的代碼是的,這段代碼看上去并不是那么的清晰明了,使用表達(dá)式改進(jìn)后或者是不得不承認(rèn),代碼看起來跟清晰了。這是由泛型接口內(nèi)部實(shí)現(xiàn)方式造成的。 # Lambda表達(dá)式在《Java8實(shí)戰(zhàn)》中第三章主要講的是Lambda表達(dá)式,在上一章節(jié)的筆記中我們利用了行為參數(shù)化來因?qū)Σ粩嘧兓男枨?,最后我們也使用到了Lambda,通過表達(dá)式為我們簡化了很多代碼從而極大地提高了我們的...
閱讀 3641·2021-11-23 10:10
閱讀 3403·2019-08-30 14:03
閱讀 2142·2019-08-30 13:09
閱讀 3466·2019-08-29 15:29
閱讀 1607·2019-08-29 11:23
閱讀 2072·2019-08-28 18:28
閱讀 2916·2019-08-26 13:34
閱讀 2219·2019-08-26 11:32