jdk1 8新特性 Lambda表示式

2021-09-13 23:18:59 字數 2131 閱讀 7661

要了解lambda表示式,我們先來說說函式式介面

函式式介面:介面中只有乙個抽象方法(有預設方法和靜態方法不影響)

lambda表示式就是為了解決函式式介面而誕生的,可以先看乙個例子來了解

現在我們要實現下面介面的drive功能,我們能怎麼做呢?

inte***ce

drive

1.通過一般類實現介面來重寫該方法
class

testdrive

implements

drive

}

但是在實際的應用場景中,我們往往不會這麼做,而是寫乙個匿名內部類

2.通過匿名內部類重寫該方法

drive drive =

newdrive()

};

或許匿名內部類是以前常用方法,現在lambda橫空出世,下面我們先來看看使用lambda如何實現這個功能需求

3.通過lambda表示式

drive drive =()

-> system.out.

println

("lambda表示式: drive car"

);

通過這個例子我們可以明顯知道lambda的優點和缺點

優點:1.比較簡潔 2.不會生成class檔案

缺點:只能針對函式式介面,如果介面中有多個方法就不能使用

下面我們來具體看看lambda表示式的語法

語法1.lambda表示式主體是 : () -> {}

小括號是引數列表,花括號是**塊。

我們前面已經說過了lambda表示式針對的是函式式介面,所以該介面最主要的就是那個抽象方法,而lambda表示就跳過介面,直接去寫這個抽象方法。可以對應一下,()就是抽象方法的引數列表,{}就是方法體。

這點是最重要的,也是最常用的。

我們來舉個例子,現在我要起乙個執行緒,我們知道執行緒可以通過給thread構造傳入乙個runnable例項,我們以前在這裡都是寫乙個匿名內部類,而現在我們就可以這樣寫

thread thread =

newthread((

)->

);

() 就對應我們的run()的形參列表,由於我們不用給run方法傳參,所以在這塊我們只用寫乙個空括號,->是連線的,必須要寫,它是lambda的乙個標誌,花括號中的內容就是我們run方法中寫的內容。是不是很簡單。

學會了這一點我們基本上可以寫出來所有的lambda表示式。但是我們還要了解其他的一些語法規範。

2.當形參列表只有乙個引數的時候,()小括號可以省略,來看乙個demo

我們先定義乙個有乙個引數抽象方法的介面

inte***ce

test

然後我們寫乙個測試類

public

class

testlambda_1

; _test.

test

("!!!");

}}

這時lambda的語法,知道就行。

3.當函式體(**塊)也就是{}裡面包括的語句只有一句時,可以省略花括號{}。

但是的情況有乙個特例,就是當花括號中只有一句**但是這句**是return語句時,這種情況是錯誤的,我們修改自定義的介面,使他有返回值。

inte***ce

test

我們用第三條規則試試

為什麼是就有這個特例呢?看看第四條就知道了

4.當抽象函式有返回值時,且只有一條語句,在第3條規則的基礎上可以繼續省略return

知道了這幾點,就可以熟練的用lambda表示式去替換那些需要函式式介面new 出來的匿名內部類了。

JDK1 8新特性 Lambda表示式

lambda表示式 函式式程式設計思想 物件導向 必須通過物件的形式來做事情.函式式思想 強調做什麼 注重結果 而不是怎麼做.lambda的格式 一些引數 介面中的抽象方法的引數,有就寫上,沒有空著 乙個箭頭 傳遞 把引數傳遞給 中的方法體 一段 重寫介面中的抽象方法的方法體 標準格式 引數型別 引...

JDK1 8的新特性

jdk1.8之前的介面不可以有方法體,但從jdk1.8開始,介面中的方法可以帶有方法體為什麼要新增這個特性?介面就是為了定義乙個標準,這個標準要求所有的實現類實現這些抽象方法。但存在某些方法,所有的實現類 都是一樣的,索性就把這些 挪到介面中。使用的方法?通過default來修飾這個方法public...

JDK1 8新特性簡介

可以用static default來定義介面方法 用default來定義普通方法,這樣子類就不用強制覆寫這個方法了。用static來定義靜態方法 專給lanmda使用的介面加上annotation functionalinte ce 其中只能有乙個方法 使用 引數 程式執行語句 引數 簡單返回 引數...