一、List排序
1、java8的API已經為List提供了一個可用的sort方法;
void sort(Comparator<? super E> c);
我們用一個蘋果類來說明,一般的寫法是這樣:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9EFRPJTWq1keNRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzAzM1EzNxEjMyITOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
我們使用匿名類來處理一下:
因為Comparator是一個函數式接口(函數式接口是指接口類中隻一個抽象方法,允許有多個預設方法),則可以使用lambda表達式。
而Comparator的函數描述符為(T,T) -> int ,接收兩個T對象,傳回一個int,用lambda表達式的效果如下。
由于java編譯器可以根據lambda出現的上下文來推斷lambda表達式參數類型,因為list泛型已經指定為Apple類型,是以方法參數類型可以省略。重寫如下:
又由于Comparator提供了一個comparing的靜态輔助方法,源碼如下:
形參是一個Function函數接口(接收一個T類型,傳回一個U類型),comparing是一個已經實作了比較功能,傳回一個Comparator對象的方法,是以我們可以寫成如下這樣:
注意上面要引入一個靜态類。根據上下文推斷,可以簡寫為如下:
而lambda表達式又有一個種方法引用(::)的代替方式,因為可以繼續簡寫:
其中jdk1.8提供的函數接口提供了相關的複合方法,可以把操作複合在一起,比如:Predicate接口就提供了negate(),and(),or()等方法,redApple.and(a -> a.getWeight() > 50).or(a -> “green”.equals(a.getColor()));