­

Java中list集合自定義排序-2022新項目

一、業務場景

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

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

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

二、需求分析

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

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

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

三、解決方案

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

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

 

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

 

 

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

結果如圖,符合預期.

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

代碼如下:

public class UserSortTest {
    public static void main(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的排在後面,最後按照用戶名稱升序排序。

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

小夥伴,歡迎留言討論。