天天看點

jdk1.8的lambda表達式與方法引用的基本用法

一、List排序

1、java8的API已經為List提供了一個可用的sort方法;

void sort(Comparator<? super E> c);

我們用一個蘋果類來說明,一般的寫法是這樣:

jdk1.8的lambda表達式與方法引用的基本用法
jdk1.8的lambda表達式與方法引用的基本用法

我們使用匿名類來處理一下:

jdk1.8的lambda表達式與方法引用的基本用法

因為Comparator是一個函數式接口(函數式接口是指接口類中隻一個抽象方法,允許有多個預設方法),則可以使用lambda表達式。

而Comparator的函數描述符為(T,T) -> int ,接收兩個T對象,傳回一個int,用lambda表達式的效果如下。

jdk1.8的lambda表達式與方法引用的基本用法

由于java編譯器可以根據lambda出現的上下文來推斷lambda表達式參數類型,因為list泛型已經指定為Apple類型,是以方法參數類型可以省略。重寫如下:

jdk1.8的lambda表達式與方法引用的基本用法

又由于Comparator提供了一個comparing的靜态輔助方法,源碼如下:

jdk1.8的lambda表達式與方法引用的基本用法

形參是一個Function函數接口(接收一個T類型,傳回一個U類型),comparing是一個已經實作了比較功能,傳回一個Comparator對象的方法,是以我們可以寫成如下這樣:

jdk1.8的lambda表達式與方法引用的基本用法

注意上面要引入一個靜态類。根據上下文推斷,可以簡寫為如下:

jdk1.8的lambda表達式與方法引用的基本用法

而lambda表達式又有一個種方法引用(::)的代替方式,因為可以繼續簡寫:

jdk1.8的lambda表達式與方法引用的基本用法

其中jdk1.8提供的函數接口提供了相關的複合方法,可以把操作複合在一起,比如:Predicate接口就提供了negate(),and(),or()等方法,redApple.and(a -> a.getWeight() > 50).or(a -> “green”.equals(a.getColor()));