Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface
Jdk1.8新增lambda表達式是為了簡化代碼,主要用于簡化匿名實現(xiàn)類,為其提供一種更加簡潔的寫法。Lambda表達式在swift語言中被稱為代碼塊,lambda表達式可以認(rèn)為是一種特殊的接口,是匿名實現(xiàn)類的簡寫,該接口必須只有一個抽象方法。
作用:
1)簡化匿名實現(xiàn)類的書寫,實現(xiàn)接口抽象方法;
2)作為函數(shù)中的參數(shù)來傳遞;
語法結(jié)構(gòu):
(參數(shù)類型 參數(shù)名1,參數(shù)類型 參數(shù)名2,……參數(shù)類型 參數(shù)名n)->{//方法體 }1)()中的內(nèi)容就是方法中的參數(shù)列表,包括參數(shù)類型、參數(shù)名,其中的參數(shù)類型可以忽略,當(dāng)參數(shù)個數(shù)只有一個時也可以忽略掉小括號;
2){}中的內(nèi)容是方法中的方法體,當(dāng)方法體中只有一行代碼時可忽略掉{},當(dāng)方法體中只有一行代碼并且需要返回值時也可以忽略掉return;
示例1:lambda表達式代替實現(xiàn)類
定義一個IGreeting接口,有三個方法:
1)無入?yún)⑷绶祷刂档姆椒?br /> 2)一個入?yún)⒁粋€返回值的方法
3)兩個入?yún)⒁粋€返回值的方法
上面的示例只定義了接口,沒有定義實現(xiàn)類,通過lambda表達式代替了實現(xiàn)類;
注意:以上代碼為了方便查看將三個方法寫到了一個接口中,但是實際上lambda接口只能有一個抽象方法,但是可以同時擁有多個靜態(tài)方法和默認(rèn)方法。
示例2:lambda表達式傳遞參數(shù)
定義一個只有一個抽象方法的接口:
函數(shù)式接口
通過上面的示例了解了lambda表達式,lambda表達式其實就是函數(shù)式接口。所謂函數(shù)式接口,首先是一個接口,然后就是這個接口里面只能有一個抽象方法。這種類型的接口也稱作SAM接口(Single Abstract Method Interface)。
函數(shù)式接口主要用在lambda表達式和方法引用(實際上也可認(rèn)為是lambda表達式)上。
@FunctionalInterface注釋
Java8為函數(shù)式接口引入了一個新的注解@FunctionalInterface,主要用于編譯級錯誤檢查。加上該注解,當(dāng)你寫的接口不符合函數(shù)式接口定義的時候,接口會報錯。
注意:
1)加不加@FunctionalInterface對于接口是不是函數(shù)式接口沒有影響,該注解只是提醒編譯器去檢查該接口是都僅包含一個抽象方法。
2)函數(shù)式接口里面允許定義默認(rèn)方法和靜態(tài)方法。因為默認(rèn)方法和靜態(tài)方法不是抽象方法,符合函數(shù)式接口的定義。
3)函數(shù)式接口里面允許定義java.lang.object里的public方法。這些方法對于函數(shù)式接口來說,不被當(dāng)成抽象方法(雖然它們是抽象方法)。因為任何一個函數(shù)式接口的實現(xiàn),默認(rèn)都繼承了object類,已經(jīng)包含了對這些抽象方法的實現(xiàn)。
Jdk中的函數(shù)式接口:
java.lang.Runnable,
java.awt.event.ActionListener,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等
總結(jié)
以上是生活随笔為你收集整理的Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jdk1.8新特性(一) 接口的defa
- 下一篇: Jdk1.8新特性(三)——方法引用::