在java中,lambda表達式與函數式接口是不可分割的,都是結合起來使用的。
對於函數式接口,我們可以理解為只有一個抽象方法的接口,除此之外它和別的接口相比並沒有什么特殊的地方。為了確保函數式接口的正確性,我們可以給這個接口添加@FunctionalInterface注解(當然,也可以不加此注解),這樣當其中有超過一個抽象方法時就會報錯。
對於其他類型的接口,我們想要使用就需要定義一個類(或者使用匿名類)來實現那個接口和其中的方法,而函數式接口除了使用普通的方法來實現之外,還有一種更加簡單的方法---就是使用lambda表達式。lambda表達式我們可以理解對於函數式接口和其中的抽象方法的具體實現,這樣當有一個需要函數式接口參數的方法時,我們就可以給其傳遞一個對應的lambda表達式作為參數。執行的時候就會自動執行函數式接口中的唯一方法,也就是傳遞過去的lambda表達式了。
下面我們來舉一個例子具體說明一下:
有如下代碼List<String> list = Arrays.asList("d", "h", "a", "z", "b");
我們要對其進行排序,有一個對應的list.sort(Comparator<? super E> c)
方法,需要我們傳遞一個Comparator接口的實例,而Comparator之中唯一的抽象方法為int compare(T o1, T o2)
,完全符合我們之前的函數式接口的定義,並且它還使用了@FunctionalInterface注解,所以除了普通的實現方法之外我們可以使用lambda表達式來實現這個方法,具體代碼如下:
List<String> list = Arrays.asList("d", "h", "a", "z", "b"); list.sort((String a, String b) -> { return a.compareTo(b); });
其相當於:
List<String> list = Arrays.asList("d", "h", "a", "z", "b"); Comparator<String> comparator = (String a, String b) -> { return a.compareTo(b); }; // 使用lambda表達式實現函數式接口,並賦值 list.sort(comparator);
當然,對於上面的lambda表達式有很多簡略寫法,這是主要說明它和函數式接口的關系,關於lambda表達式的其他很多的使用方法大家可以去具體查詢使用。