像使用SQL同樣對List對象集合進行排序

使用Java8的Comparator排序List對象集合

在開始以前,我先賣個關子提一個問題:假設咱們有一個Movie類,這個類有三個成員變量分別是starred(是否收藏), title(電影名稱), rating(評分)。你知道怎麼對一個Movie對象組成的List集合,先按照是否收藏字段倒序排序,再按照評分的倒序進行排序麼?若是您不知道4行代碼之內的解決方案(實際上是1行代碼就能夠實現,但筆者格式化爲4行),我以爲您有必要一步步的看下去。java

在java 8 以前,實現對象Collection排序,集合中被排序和比較大小的對象得實現Comparable接口。在java 8以後,有了Comparator比較器的概念,使用Comparator完成對象數組的排序更加方便快捷,下面就給你們簡單的介紹一下java 8中使用Comparator排序的方法。spring

1、字符串List排序

使用Java8的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()做爲參數。segmentfault

2、整數類型List排序

使用Java8的Comparator排序List對象集合

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

3、按對象字段對對象List排序

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

使用Java8的Comparator排序List對象集合

  • 首先,咱們建立了四個Movie對象,而後將它們轉換爲List
  • 而後重點的的代碼:使用了函數應用Movie::getTitle做爲對象的排序字段,即按照電影的title做爲排序字段
  • 而後調用List的forEach方法將List排序結果打印出來,以下(固然咱們重寫了toString方法,否則打印結果沒有意義):

使用Java8的Comparator排序List對象集合

  • 若是咱們但願List按照Title的倒序排序,就使用reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。

4、使用自定義Comparator排序

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

使用Java8的Comparator排序List對象集合

最終的打印結果以下,按照started的自定義規則進行排序。學習

使用Java8的Comparator排序List對象集合

這段代碼若是以lambda表達式簡寫。箭頭左側是參數,右側是函數體,參數類型和返回值根據上下文自動判斷。以下:spa

使用Java8的Comparator排序List對象集合

5、經過Comparator鏈對對象List排序

使用Java8的Comparator排序List對象集合

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

使用Java8的Comparator排序List對象集合

期待您的關注

相關文章
相關標籤/搜索