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