java8新特性之lambda表達式與函數式接口

前言

 本文的思路是先介紹lambda重要特徵並給出實際用例,再介紹lambda與函數式接口的關係引出函數式接口,再敘述函數式接口的相關特點。

lambda重要特徵

1、可選的大括號 

當方法體內只包含了一個語句時,可以選擇省略大括號,方法體末尾不需要分號。如上例,System.out.println("lambda1")語句就沒有用大括號括起來,語句末尾也沒有分號。

如果方法體有多行,就要用{}括起來,末尾也要跟上分號。

 2、可選的類型聲明

lambda表達式有類型推斷機制,在上下文信息足夠多的情況下能夠推斷出參數表的類型而無需指明。

比如Collections.sort()

可以指明a和b的參數類型爲String

 

也可以省略參數類型,因爲java可以根據list的類型推斷出s1和s2的參數類型

3、 可選的參數圓括號

只有一個參數時可以省略參數圓括號,無參或是多參都要寫上圓括號

4、可選的參數關鍵字

如果方法體只有一個表達式並且未使用大括號,那麼編譯器會自動返回值。

 

 什麼時候可以簡寫爲lambda

我們分別來看兩個匿名內部類的簡寫,分析爲什麼它們可以簡寫成lambda,總結出什麼情況下可以簡寫爲lambda。

簡寫爲

觀察上面兩個匿名內部類,我們可以發現:它們的接口名以及方法名都被擦拭掉了。所以我們可以得出:可以被簡寫的接口中的抽象方法唯一,因爲不唯一的話方法名被擦拭了那就無法識別是哪個方法了。這也就是我們的函數式接口:只有一個抽象方法的接口(不包含一些特殊情況,這些特殊情況下面會介紹)。

函數式接口

JDK1.8前的函數式接口:

 JDK1.8新定義的函數式接口:

 

 

函數式接口是隻能有一個抽象方法的接口,但這也有例外,接口可以定義Object類的public方法,但這些方法的方法簽名必須和Object類的一樣,這些方法也是抽象方法,但並不影響該接口成爲函數式接口:

該接口雖然多出了hashCode這個抽象方法,但仍是函數式接口,因爲hashCode是Object類的public方法。

 

 

 接口中的抽象方法和默認方法不會影響該接口成爲函數式接口:

該接口中雖然有print這個默認方法,print1這個抽象方法,但仍是函數式接口。

 

 

@FunctionnalInterface作用 

函數式接口可以不用@FunctionalInterface註解修飾,非函數式接口一定不能用@FunctionalInterface修飾,因爲@FunctionalInterface會在編譯期檢查該接口是否爲函數式接口,如果不是,則會編譯錯誤。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章