java lambda表达式详解_Lambda表达式详解
1 Lambda表達(dá)式是Java8中的新特性
Java8中引入Lambda表達(dá)式,使得java可以函數(shù)式編程,在并發(fā)性能上邁出了實質(zhì)性的一步。
什么是函數(shù)式編程?函數(shù)式編程(英語:functional programming)或稱函數(shù)程序設(shè)計,又稱泛函編程,是一種編程范型,它將電腦運算視為數(shù)學(xué)上的函數(shù)計算,并且避免使用程序狀態(tài)以及易變對象。函數(shù)編程語言最重要的基礎(chǔ)是λ演算(lambda calculus)。而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(引數(shù))和輸出(傳出值)。
ps:λ這個符號可以在搜狗輸入法的符號中顯示
而在面向?qū)ο缶幊讨?#xff0c;面向?qū)ο蟪绦蛟O(shè)計(英語:Object-oriented programming,縮寫:OOP)是種具有對象概念的程序編程范型,同時也是一種程序開發(fā)的方法。它可能包含數(shù)據(jù)、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴(kuò)展性,對象里的程序可以訪問及經(jīng)常修改對象相關(guān)連的數(shù)據(jù)。在面向?qū)ο蟪绦蚓幊汤?#xff0c;計算機(jī)程序會被設(shè)計成彼此相關(guān)的對象。
2 lambda表達(dá)式能干什么?
@FunctionalInterface使用匿名內(nèi)部類的一個問題是:當(dāng)一個匿名內(nèi)部類的實現(xiàn)非常簡單,比如說接口只有一個抽象函數(shù) ,那么匿名內(nèi)部類的語法有點笨拙且不清晰。
使用下面這種方法的時候,不需要再使用new XXX(){}這種繁瑣代碼,不需要指出重寫的方法的名字,也不需要給出重寫方法的返回值類型,只要給出重寫的方法括號以及括號里的形參列表即可
從上面介紹考科一看出,當(dāng)使用Lambda表達(dá)式代替匿名內(nèi)部類創(chuàng)建對象時,Lambda表達(dá)式的代碼塊將會代替實現(xiàn)抽象方法的方法體,Lambda表達(dá)式就相當(dāng)于一個匿名方法
3 語法
(參數(shù))->表達(dá)式 或 (參數(shù))->{方法體;}
1.形參列表:
形參列表允許省略形參類型,若形參列表中只有一個參數(shù),形參列表的圓括號也可以省略代碼
2.箭頭(->)
必須通過英文中劃線號和大于符號組成
3.代碼塊:
如果代碼塊只包含一條語句,lambda表達(dá)式允許省略代碼塊的花括號,那么這條語句就不要用花括號表示語句結(jié)束
lambda代碼塊只有一條return語句,甚至可以省略return關(guān)鍵字
lambda表達(dá)式需要返回值,而它的代碼塊中僅有一條省略了return的語句,lambda表達(dá)式會自動返回這條語句的結(jié)果
lambda表達(dá)式的寫法:
interfacelambda表達(dá)式就可以把函數(shù)當(dāng)做函數(shù)的參數(shù),代碼(函數(shù))當(dāng)做數(shù)據(jù)(形參),這種特性滿足上述需求。當(dāng)要實現(xiàn)只有一個抽象函數(shù)的接口時,使用lambda表達(dá)式能夠更靈活。
interface4 Lambda表達(dá)式與函數(shù)式接口
在上面的案例中.方法的參數(shù)的數(shù)據(jù)類型或是獲取一個對象,但是在實際調(diào)用中我們傳入的是一個lambda表達(dá)式,可以發(fā)現(xiàn)程序可以
正常編譯,運行,這說明Lambda表達(dá)式實際上將會被當(dāng)成一個"類型"的對象
Lambda表達(dá)式的類型,也被稱為"目標(biāo)類型(target type)",Lambda表達(dá)式的目標(biāo)類型必須是"函數(shù)式接口(functional interface)"
ps:Java8新引入的概念,函數(shù)接口(functional interface)。它的定義是:一個接口,如果只有一個顯式聲明的抽象方法,那么它就是一個函數(shù)接口。一般用@FunctionalInterface標(biāo)注出來 (也可以不標(biāo)記),函數(shù)式接口可以包含多個default或static方法,但是只能聲明一個抽象方法
@FuctionalInterface主要作用就是檢查當(dāng)前接口是不是函數(shù)接口
若想使用lambdaname目標(biāo)必須是一個函數(shù)接口
5 Lambda表達(dá)式引用全局和局部變量
@FunctionalInterface6 方法引用與構(gòu)造器引用
如果Lambda表達(dá)式的代碼塊只有一條代碼,程序就可以省略Lambda表達(dá)式中的代碼塊的花括號
不僅如此,如果Lambda表達(dá)式的代碼塊只有一條代碼,還可以在代碼塊中使用方法引用和構(gòu)造器引用
方法引用和構(gòu)造器引用都需要使用::兩個英文冒號
6.1 引用類方法
在函數(shù)式接口中定義的抽象方法,而方法的實現(xiàn)是觸發(fā)某個類.方法(調(diào)用類方法的形式)來完成時可以使用
@FunctionalInterface6.2 引用特定對象的實例方法
在函數(shù)式接口中定義的抽象方法,而方法的實現(xiàn)是觸發(fā)對象.方法(調(diào)用類方法的形式)來完成時可以使用
@FunctionalInterface6.3 引用某類對象的實例方法
在函數(shù)式接口中定義的抽象方法,而方法的實現(xiàn)是觸發(fā)是方法中第一個參數(shù)的對象.方法(調(diào)用類方法的形式)來完成時可以使用
@FunctionalInterface6.4 引用構(gòu)造方法
在函數(shù)式接口中定義的抽象方法,而方法的返回值是一個對應(yīng)類的實例
@FunctionalInterface7 Lambda表達(dá)式和匿名內(nèi)部類的區(qū)別
1.匿名內(nèi)部類可以為任意接口創(chuàng)建實例,不管接口包含多少個抽象方法,只要匿名內(nèi)部類實現(xiàn)所有的抽象方法即可
但Lambda表達(dá)式只能為函數(shù)式接口創(chuàng)建實例(即只能有一個抽象方法)
2.匿名內(nèi)部類可以為抽象類甚至是普通類創(chuàng)建實例
但Lambda表達(dá)式只能為函數(shù)式接口創(chuàng)建實例
3.匿名內(nèi)部類實現(xiàn)的抽象方法的方法體允許調(diào)用接口中定義的默認(rèn)(default)方法
但Lambda表達(dá)式的代碼塊不允許調(diào)用接口中的默認(rèn)(default)方法
8 Lambda表達(dá)式應(yīng)用
String總結(jié)
以上是生活随笔為你收集整理的java lambda表达式详解_Lambda表达式详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站能拿到其他网站的cookie_在网站
- 下一篇: android fragment fra