Java中list集合自定義排序-2022新專案

語言: CN / TW / HK

一、業務場景

為了加快首頁資料查詢的效率,因此將首頁查詢的資料大多數都放在了快取中,包括各種 list 集合資料。對這些

從快取中獲取的資料做了一個兜底處理,如果從快取中沒有獲取到資料,則直接從資料庫中去查詢獲取資料,然後

在對查詢到的資料做進一步的處理。從快取中獲取的資料都已經做排序處理了,可是對查詢的資料如何進行排序處理呢?

二、需求分析

這裡查詢的時候,資料量不多,全國範圍內的資料加起來估計也就幾千條,因此是按照一定的條件進行全量查詢,獲取

到資料後在進行過濾,然後是按照指定的要求進行排序。業務需求可能會按照多種方式進行排序,而且有可能是降序或者是

升序,因此排序方式還不能寫死。那自己能想到的辦法有 java8 中的 stream 流排序,其次就是 list 集合自帶的排序介面 sort.

三、解決方案

自己私下裡做了簡單的測試,兩種方式都可以進行排序,不過為了簡化程式碼的操作,考慮使用 list 集合自帶的排序介面來

進行排序。首先看對於這個自帶介面的說明,

排序介面是傳一個比較器,然後集合底層會自動的進行排序。

先做一個簡單的測試, 從結果來看,預設是升序排序,按照年齡從小到大的排序。如果想降序的話怎麼處理呢?很簡單,呼叫一個方法 reversed() 即可。

結果如圖,符合預期 .

問題來了,如何想要先按照年齡排序,然後在按照生日排序怎麼處理呢?

程式碼如下 :

public classUserSortTest {

public static voidmain(String[] args) throws ParseException {

SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );

List<User> users = new ArrayList<>();

User user1 = new User();

user1.setAge( 20);

Date date1 = sdf.parse( "2020-12-06 12:26:10" );

user1.setBirthday(date1);

users.add(user1);

User user2 = new User();

user2.setAge( 20);

Date date2 = sdf.parse( "2008-12-06 20:30:26" );

user2.setBirthday(date2);

users.add(user2);

users.sort(Comparator. comparing (User::getAge).thenComparing(User::getBirthday));

for(User user : users) {

System. out .println( "user--->" + user.toString());

}

}

}

這是先按照歲數升序,然後在是按照生日升序排序的結果,如果按照生日降序排序,則就需要改變一下程式碼,如下:

users.sort(Comparator.comparing(User::getAge).thenComparing(Comparator.comparing(User::getBirthday).reversed()));

在比較器中在傳入一個比較器,這樣就可以解決問題,測試結果如下 .

繼續如果有一個引數為 null 會報異常,這種情況如何處理呢?

比較器排序中也做了響應的處理,處理方式如下:

users.sort(Comparator.comparing(User::getAge).thenComparing(User::getBirthday,Comparator.nullsLast(Date::compareTo)));

這行程式碼的含義是將為 null 值的資料排在最後面,測試結果如下 .

上面的方式學會了,如果還有第三種排序方式,則繼續在後面新增方法即可,

這段程式碼的含義是:首先按照年齡升序排序,然後按照出生日期升序排序,出生日期為 null 的排在後面,最後按照使用者名稱稱升序排序。

學會了這幾種排序方式之後,自己就可以在程式碼中進行任意組合,來達到自己對於排序的要求,很好的完成業務需求。有其他建議的

小夥伴,歡迎留言討論。