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

2022-08-13 12:00:45

一、業務場景

  為了加快首頁資料查詢的效率,因此將首頁查詢的資料大多數都放在了快取中,包括各種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的排在後面,最後按照使用者名稱稱升序排序。

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

小夥伴,歡迎留言討論。