1. 程式人生 > >jdk8新特性:Lambda表示式(也稱為閉包、可傳遞的匿名函式)與函式式介面@FunctionalInterface

jdk8新特性:Lambda表示式(也稱為閉包、可傳遞的匿名函式)與函式式介面@FunctionalInterface

  1) 一個lambda可以由用逗號分隔的引數列表、–>符號與函式體三部分表示。例如:

ex.1

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );
ex.2 
(Computer c1, Computer c2) -> c1.getPrice().compareTo(c2.getPrice());
上面是一個lambda表示式,等價於匿名內部類:
new Comparator<Computer>() {
        @Override
        public
int compare(Computer c1, Computer c2) { return c1.getPrice().compareTo(c2.getPrice()); } };

    使用場景:上面和匿名內部類的對比,不難發現,在一些需要使用匿名內部類的地方,就可以用lambda代替。Java8中,對lambda的使用做了引導和規範,一般在函式式介面上使用lambda。

    2)Functional介面

    @FunctionalInterface標記在介面上,“函式式介面”是指僅僅只包含一個抽象方法的介面,該註解有以下特點:    

        1、該註解只能標記在"有且僅有一個抽象方法"的介面上。

        2、JDK8介面中的靜態方法和預設方法,都不算是抽象方法。

        3、介面預設繼承java.lang.Object,所以如果介面顯示宣告覆蓋了Object中方法,那麼也不算抽象方法。

        4、該註解不是必須的,如果一個介面符合"函式式介面"定義,那麼加不加該註解都沒有影響。加上該註解能夠更好地讓編譯器進行檢查。如果編寫的不是函式式介面,但是加上了@FunctionInterface,那麼編譯器會報錯。

ex:

@FunctionalInterface
public interface
TestInterface {
double calculate(int a); // double calculate2(int a); default double sqrt(int a) { return Math.sqrt(a); } default double sqrt2(int a) { return Math.sqrt(a); } static void staticMethod() { System.out.println("介面中的靜態方法1"); } // default修飾符定義預設方法 default void defaultMethod() { System.out.println("介面中的預設方法1"); }