1. 程式人生 > >像使用SQL一樣對List物件集合進行排序

像使用SQL一樣對List物件集合進行排序

在開始之前,我先賣個關子提一個問題:假設我們有一個Movie類,這個類有三個成員變數分別是starred(是否收藏), title(電影名稱), rating(評分)。你知道怎麼對一個Movie物件組成的List集合,先按照是否收藏欄位倒序排序,再按照評分的倒序進行排序麼?如果您不知道4行程式碼以內的解決方案(其實是1行程式碼就可以實現,但筆者格式化為4行),我覺得您有必要一步步的看下去。

在java 8 之前,實現物件Collection排序,集合中被排序和比較大小的物件得實現Comparable介面。在java 8之後,有了Comparator比較器的概念,使用Comparator完成物件陣列的排序更加方便快捷,下面就給大家簡單的介紹一下java 8中使用Comparator排序的方法。

一、字串List排序

  • cities是一個字串陣列。注意london的首字母是小寫的。
  • 當使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小寫不敏感)的規則排序,結果是:[london, Milan, New Delhi, San Francisco, Tokyo]
  • 如果使用Comparator.naturalOrder()字母自然順序排序,結果是:[Milan, New Delhi, San Francisco, Tokyo, london]

在java 7我們是使用Collections.sort()接受一個數組引數,對陣列進行排序。在java 8之後可以直接呼叫集合類的sort()方法進行排序。sort()方法可以傳入一個字串的排序規則,如:String.CASE_INSENSITIVE_ORDER,也可以傳入一個排序器Comparator.naturalOrder()作為引數。

二、整數型別List排序

按數字的自然順序排序,結果是[1, 2, 4, 6, 9]

三、按物件欄位對物件List排序

這個功能就比較有意思了,舉個例子大家理解一下。假設我們有一個類Movie,有三個成員變數分別是starred(是否收藏), title(電影名稱), rating(評分)。

  • 首先,我們建立了四個Movie物件,然後將它們轉換為List
  • 然後重點的的程式碼:使用了函式應用Movie::getTitle作為物件的排序欄位,即按照電影的title作為排序欄位
  • 然後呼叫List的forEach方法將List排序結果打印出來,如下(當然我們重寫了toString方法,不然列印結果沒有意義):

  • 如果我們希望List按照Title的倒序排序,就使用reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。

四、使用自定義Comparator排序

我們自定義一個排序器,實現compare函式。返回0表示元素相等,-1表示前一個元素小於後一個元素,1表示前一個元素大於後一個元素。這個規則似乎和java 8之前沒什麼區別。

最終的列印結果如下,按照started的自定義規則進行排序。

這段程式碼如果以lambda表示式簡寫。箭頭左側是引數,右側是函式體,引數型別和返回值根據上下文自動判斷。如下:

五、通過Comparator鏈對物件List排序

上面這段程式碼先是按是否收藏的倒序排序,再按照電影的評分大小的倒序排序,排序結果如下:

期待您的關注

  • 博主最近新寫了一本書:《手摸手教您學習SpringBoot系列-16章97節》
  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。