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