JDK1.8的新特性之Lambda表示式

精勤,荒嬉。形成思,毀於隨發表於2019-08-14

在這裡插入圖片描述

(一)JDK1.8的新特性之Lambda表示式

在這裡插入圖片描述

什麼是Lambda表示式?

可以將Lambda表示式理解為一個匿名函式; Lambda表示式允許將一個函式作為另外一個函式的引數; 我們可以把 Lambda 表示式理解為是一段可以傳遞的程式碼(將程式碼作為實參),也可以理解為函數語言程式設計,將一個函式作為引數進行傳遞。

為什麼要引入Lambda表示式?

這就好像小強看到小明的手裡拿了一把玩具手槍,自己也想擁有一把一樣。當java程式設計師看到其他語言的程式設計師(如JS,Python)在使用閉包或者Lambda表示式的時候,於是開始吐槽世界上使用最廣的語言居然不支援函數語言程式設計。千呼萬喚,Java8推出了Lambda表示式。

Lambda表示式能夠讓程式設計師的程式設計更加高效

Lambda 是一個匿名函式,我們可以把 Lambda表示式理解為是一段可以傳遞的程式碼(將程式碼像資料一樣進行傳遞)。可以寫出更簡潔、更靈活的程式碼。作為一種更緊湊的程式碼風格,使Java的語言表達能力得到了提升。
那我們來看一下如何書寫Lambda的表示式
Lambda表示式的語法:
([Lambda引數列表,即形參列表]) -> {Lambda體,即方法體}

拷貝小括號,寫死右箭頭,落地大括號,大括號中寫上業務邏輯

特點:使用 "->"將引數和實現邏輯分離;( ) 中的部分是需要傳入Lambda體中的引數;{ } 中部分,接收來自 ( ) 中的引數,完成一定的功能。

Lambda 表示式在Java 語言中引入了一個新的語法元素和操作符。這個操作符為 “ ->” , 該操作符被稱為 Lambda 操作符或箭頭操作符。它將 Lambda 分為兩個部分:
左側: 指定了 Lambda 表示式需要的所有引數
右側: 指定了 Lambda 體,即 Lambda 表示式要執行的功能

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
上述 Lambda 表示式中的引數型別都是由編譯器推斷得出的。 Lambda 表示式中無需指定型別,程式依然可以編譯,這是因為 javac 根據程式的上下文,在後臺推斷出了引數的型別。 Lambda 表示式的型別依賴於上下文環境,是由編譯器推斷出來的。這就是所謂的“型別推斷”.

什麼是函式式介面

上文我們提到函式式介面,那麼其實我們的Lambda表示式就是對函式式介面的一種簡寫方式,所以只有是函式式介面,我們才能用Lambda表示式.再換句話說,Lambda表示式需要函式式介面的支援,那函式式介面我們可以自己定義,當然JDK1.8也給我們提供了一些現成的函式式介面.
函式式介面的定義是: 只包含一個抽象方法的介面,稱為函式式介面。
你可以通過 Lambda 表示式來建立該介面的物件
我們可以在任意函式式介面上使用 @FunctionalInterface 註解,這樣做可以檢查它是否是一個函式式介面,同時 javadoc 也會包含一條宣告,說明這個介面是一個函式式介面.

在這裡插入圖片描述
在這裡插入圖片描述

方法引用與構造器引用

我們先來看一下什麼是方法引用:方法引用其實是Lambda表示式的另一種寫法,
當要傳遞給Lambda體的操作,已經有實現的方法了,可以使用方法引用.
注意:實現抽象方法的引數列表,必須與方法引用方法的引數列表保持一致!
方法引用:使用操作符 “ ::” 將方法名和物件或類的名字分隔開來。
如下三種主要使用情況:
 物件::例項方法
 類::靜態方法
 類::例項方法

在這裡插入圖片描述
在這裡插入圖片描述

當需要引用方法的第一個引數是呼叫物件,並且第二個引數是需要引
用方法的第二個引數(或無引數) 時:ClassName::methodName

在這裡插入圖片描述

構造器引用

格式:ClassName::new
與函式式介面相結合,自動與函式式介面中方法相容。可以把構造器引用賦值給定義的方法,與構造器引數列表要與介面中抽象方法的引數列表一致!

在這裡插入圖片描述

相關文章