在某些特殊的場景下,我們需要在 Java 程式中對 List 集合進行排序操作。比如從第三方接口中擷取所有使用者的清單,但清單預設是以使用者編号從小到大進行排序的,而我們的系統需要按照使用者的年齡從大到小進行排序,這個時候,我們就需要對 List 集合進行自定義排序操作了。
List 排序的常見方法有以下 3 種:
使用 Comparable 進行排序;
使用 Comparator 進行排序;
如果是 JDK 8 以上的環境,也可以使用 Stream 流進行排序。
下面我們分别來看各種排序方法的具體實作。
按照本文設計的場景,我們需要建立一個包含了使用者清單的 List 集合,并按使用者的年齡從大到小進行排序,具體實作代碼如下:
以上代碼的執行結果,如下圖所示:
本方法的核心代碼如下:
Comparable 是類内部的比較方法,而 Comparator 是排序類外部的比較器。使用 Comparator 比較器,無需修改原 Person 類,隻需要擴充一個 Person 類的比較器就行了,Comparator 的實作方法有以下兩種:
建立 Comparator 比較器;
使用 Comparator 匿名類比較器。
其中,第二種實作方法要更簡潔一些,我們通過下面的具體代碼,來觀察一下二者的差別。
本方法的核心實作代碼如下:
比較器 Comparator 可以使用更簡潔的匿名類的方式,來實作排序功能,具體實作代碼如下:
在 JDK 8 之後可以使用更加簡單的方法 Stream 流來實作排序功能,它的實作隻需要一行代碼,具體實作如下:
其中 reversed() 表示倒序的意思,如果不使用此方法則是正序。
使用 Stream 進行排序時,如果排序的字段出現 null 值就會導緻異常發生,具體示例如下:
想要解決上述問題,需要給 Comparator.comparing 傳遞第二個參數:Comparator.nullsXXX,如下代碼所示:
Comparator.nullsFirst 表示将排序字段中的 null 值放到集合最前面,如果想要将 null 值放到集合最後面可以使用 Comparator.nullsLast。
本文介紹了 3 種 List 排序的方法,前兩種方法常用于 JDK 8 之前的版本,其中比較器 Comparator 有兩種實作的寫法,而在 JDK 8 之後的版本,就可以使用 Comparator.comparing 實作排序了,如果排序字段中可能出現 null 值,要使用 Comparator.nullsXXX 進行排序處理(否則會報錯)。
卒然臨之而不驚,無故加之而不怒。享受平凡生活中的喜悅,終身成長者。 部落客:80 後程式員。愛好:讀書、寫作和慢跑。 公衆号:Java面試真題解析
關注下面二維碼,訂閱更多精彩内容。

關注公衆号(加好友):
作者:
王磊的部落格
出處:
http://vipstone.cnblogs.com/