Comparable
public interface Comparable<T>{
int compareTo(T other);
}
這是一個函數式接口,用於比較和排序,jdk提供了一些工具類對一組對象進行排序,前提是這些對象所屬類必須實現了Comparable
接口的compareTo()
方法,例如:
Arrays.sort(Object[] a); ///要求a中的元素的實際類型必須是Comparable接口的實現類;
static <T extends Comparable<? super T>> Collections.sort(List<T> list) // 要求類型T必須是Comparable接口的實現類
JDK的八大基本類型的封裝類都實現了Comparable接口。
Comparator
Core Java 6.3.8
Comparator提供了許多靜態方法和默認方法,爲大數據的比較和排序提供了支持。
對於靜態方法,調用格式是:Comparator.<T>method()
如獲取String類的比較器:Comparator.<String>naturalOrder();
如果做了靜態導入,類型又能推導出來,則直接方法名即可
import static java.util.Comparator.*;
...
Arrays.sort(strings, naturalOrder());
Comparator中的API
static <T> Comparator<T> nullsFirst(); // null小於所有值
static <T> Comparator<T> nullsLast(); //null值大於所有值
static <T extends Comparable<? super T>> Comparator<T> naturalOrder(); // 如果某類型實現了Comparable接口,那麼此方法能調用類型的comapareTo()方法去構造出一個Comparator
default Comparator<T> reversed(); // 一個反序的比較器
static <T extends Comparable<? super T>> Comparator<T> reverseOrder(); // 構造一個與類型T的compareTo()方法的排序相反的比較器
default Comparator<T> comparaing( Funcation<T,R> keyExtractor ); //構造一個比較器,參數 keyExtractor 是一個函數式接口,用來確定根據類型T的哪個域做比較,
comparing
static <T,U extends Comparable<? super U>> Comparator<T> comparing( Funcation<? super T,? extends U> keyExtractor );
創建出一個比較器,參數 keyExtractor 是一個函數式接口,用來確定根據類型T的哪個域排序,要求域的類型U必須實現了Comparable接口。
例如:根據Person類型的name字段對一個Person[]數組排序
Arrays.sort(people,
Comparator.<Person,String>comparing(
(Person person)->{return person.getName();}
)
);
// 以上代碼可以簡寫如下:
import static java.util.Comparator.*;
...
Arrays.sort(people,comparing(Person::getName));
static <T,U> Comparator<T> comparing( Funcation<? super T,? extends U> keyExtractor , Comparator<? super U> keyComparator);
創建出一個比較器,參數 keyExtractor 是一個函數式接口,用來確定根據類型T的哪個域排序;參數keyComparator是一個類型U的比較器。
其變體有:
comparingInt(ToIntFunction<? super T> keyExtractor); //keyExtracotr的返回的域類型必須是Int
// 還有comparingLong / comparingDouble
thenComparing
例如:對於類Student,先按照name排序,如果name相同,則再按照age排序。
Arrays.sort(students,
comparing(Student::getName).thenComparingInt(Student::getAge))
排序中遇到null時的處理
nullsFirst(Comparator<? super T> comparator)
例如,按照name對Student排序,如果遇到name爲null的,全都排在最前
Arrays.sort(students, nullsFirst(comparing(Student::getName));
還有nullsLast