一、業務場景
為了加快首頁資料查詢的效率,因此將首頁查詢的資料大多數都放在了快取中,包括各種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的排在後面,最後按照使用者名稱稱升序排序。
學會了這幾種排序方式之後,自己就可以在程式碼中進行任意組合,來達到自己對於排序的要求,很好的完成業務需求。有其他建議的
小夥伴,歡迎留言討論。