可以像使用SQL一樣對List進行排序麼?java8排序鏈,真香

2020-12-27 字母哥博客

在開始之前,我先賣個關子提一個問題:假設我們有一個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排序

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

期待您的關注

通過搜-suo-查詢「字母哥博客」或zimug點靠m,更多精品合集知識等待你!

本號只做持續的知識輸出,希望您能關注、評論、轉發!您的支持是我不竭的創作動力!讓知識產生價值、讓程式設計師改變世界!

相關焦點

  • mysql進行查詢時可以用limit限制查詢結果的條數,Java可以嗎?
    「select * from 表名 limit 1」這樣的限制查詢條數的sql語句大家應該都有使用過吧。通過這樣的sql語句,可以只返回符合條件的指定前幾條數據。那在java中有沒有這樣的功能呢?今天要說的就是通過對流的處理,實現類似sql中limit的效果。還是用一下之前的類和準備的數據。接下來我們來從這個集合list中取前兩條試試。具體要怎麼做呢,往下看吧。
  • Java開發之List排序你知道怎麼實現嗎?
    在Java開發中常見的排序算法有兩大類:不穩定排序算法:快速排序、希爾排序、堆排序、直接選擇排序穩定排序算法:基數排序、冒泡排序、直接插入排序、折半插入排序、歸併排序通過排序可以得到我們理想的數據序列,本文我們以List為列,來對List中的對象進行排序。
  • 巧用Java8中的Stream,讓集合操作飛起來!
    比如在項目中經常用到集合,遍歷集合可以試下lambda表達式,經常還要對集合進行過濾和排序,Stream就派上用場了。用習慣了,不得不說真的很好用。Stream作為java8的新特性,基於lambda表達式,是對集合對象功能的增強,它專注於對集合對象進行各種高效、便利的聚合操作或者大批量的數據操作,提高了編程效率和代碼可讀性。
  • python之lambda定義匿名函數實現對list列表排序
    前言關於匿名函數的使用及應用之前的文章也有講過,本文再來講解一個關於匿名函數的一個案例:使用匿名函數實現對list列表進行排序。說明:reverse : 是一個邏輯值,False表示升序排序,True表示降序排序。key:默認值為None,表示如果不指定參數則直接使用list列表中的元素進行排序,而數字和字符串是可以自身排序的,所以沒有問題。
  • sqltoy-orm-4.16.16 發版,並行查詢場景增強、級聯增加排序
    致謝:       感謝廣大網友的積極使用和反饋,提出了非常好的意見,讓sqltoy再次變得嚴謹和細膩!
  • 像寫SQL一樣編寫Java數據應用
    我們知道SQL實際是是一種數據為領域的DSL語言,如果我們能直接在Java中編寫SQL,然後執行結果就可以直接返回Java對象,這個問題不就有了良好的解決方案麼?為了解決這個問題,我首先查閱了一些現成的解決方案,但是有的不是開源的,有的支持的還不是非常到位。因此,我們決定嘗試著寫一下,寫了半天時間看了看效果,感覺還不錯。
  • python給list排序的簡單方法
    其實會出現這種情況是由於計算機算法的排序,會根據關鍵詞關聯、搜索量等原因排序。那你知道在python中如何給列表排序嗎?今天,小編教教大家如何給列表排序。sort()方法會對list中元素按照大小進行排序list.sort(key=None,reverse=False)實例:In [57]: l=[27,47,3,42,19,9]In [58]: l.sort()In [59]: lOut[59]: [3, 9, 19,
  • 美團開源 SQL 優化工具 SQLAdvisor,與內部版本保持一致
    分析 Join 條件首先會得到一個 nested_join 的 table list,通過判斷它 join_using_fields 欄位是否為空來區分 Join on 與 Join using。生成的 table list 以二叉樹的形式進行存儲,以後序遍歷的方式對二叉樹進行遍歷。
  • 資料庫SQL腳本優化
    ,一個大的sql要是在滿足業務需求的情況下可以分解為多個小sql是最好的。進行函數計算。14、在程序端能實現的情況下,不建議用觸發器或者主外鍵等功能(就資料庫性能而言)15、如果執行一個簡單的sql查詢,長時間沒有返回結果,那麼可以通過show processlist看一下,state列是否異常(waiting for table metadata lock或者waiting for table flush
  • python數據分析我覺得可以用pandasql,真香!
    python非常好用,pandas也不差,但是,SQL仍然是最香的語言
  • 使用集合工具類Collections對集合進行排序Collections.sort()
    如何對集合進行排序?我們看一下Collecctions類裡面的兩個靜態方法:方法一、public static <T extends Comparable<?super T>> void sort(List<T> list) 將集合中的元素按默認規則進行排序ArrayList<String> list = new ArrayList<>();list.add("a");
  • Python:Pandas的DataFrame如何按指定list排序
    前言寫這篇文章的起由是有一天微信上一位朋友問到一個問題,問題大體意思概述如下:現在有一個pandas的Series和一個python的list,想讓Series按指定的list進行排序,如何實現?這個問題的需求用流程圖描述如下:我思考了一下,這個問題解決的核心是引入pandas的數據類型「category」,從而進行排序。在具體的分析過程中,先將pandas的Series轉換成為DataFrame,然後設置數據類型,再進行排序。思路用流程圖表示如下:
  • 適用於初學者和分析師的SQL –使用Python入門SQL
    提取物()要獲取多行,可以執行SELECT語句並僅使用對Cursor對象的單個調用直接對其進行迭代:#遍歷行為 排 在 當前。執行(「從客戶中選擇名稱;」):列印(行)但是,檢索多個記錄的更好方法是使用fetchall()方法,該方法以列表格式返回所有記錄:#獲取查詢結果的所有行,並返回列表CUR。
  • HiveSql基礎函數使用(三)
    特別是使用count distinct時,count(distinct )在數據量大的情況下,效率較低,因為count(distinct)是按distinct欄位排序,一般這種分布方式是很傾斜的。排序函數:order by、sort by、distribute by、 cluster by的區別order by:通常是將所有的數據都通過一個reducer對其進行排序處理,即全局排序的過程。對於數據集比較大時,會消耗比較多的時間來執行。
  • 像Excel一樣使用SQL進行數據分析
    Excel是數據分析中最常用的工具 ,利用Excel可以完成數據清洗,預處理,以及最常見的數據分類,數據篩選,分類匯總,以及數據透視等操作,而這些操作用SQL一樣可以實現。SQL不僅可以從資料庫中讀取數據,還能通過不同的SQL函數語句直接返回所需要的結果,從而大大提高了自己在客戶端應用程式中計算的效率。
  • 用Select×進行SQL查詢的七宗罪
    因此,除非能夠給出充分的理由,否則我們很難撼動他們使用此類便捷查詢語句的習慣。   下面,我將根據自己在應用編程中的實際經驗,向大家證明使用Select * from table進行SQL查詢的「七宗罪」。
  • Java中對List做排序要怎麼做?請看正文
    為了不對後續代碼中方法的使用有疑問。@Data和@AllArgsConstructor這兩個註解是lombok的兩個註解。他們的功能是在代碼編譯時增加一些代碼,從而達到讓程式設計師減少編碼工作量的效果。@Data這個註解,可以在編譯時,針對類中的欄位增加對應的get、set方法。
  • php怎樣對mysql的數據進行排序?
    在上一篇文章中我們了解了如何進行條件查詢,用where這個關鍵字來實現條件查詢,過濾掉很多我們不需要的信息,大大節省了帶寬,今天我們來學習一下怎樣對mysql的數據進行排序,指定一個排序的規則,比如說我們要根據姓名來排序,或者是根據年齡來排序,這些都是可以通過mysql中的order by這個關鍵字來實現
  • SQL Server解惑——為什麼ORDER BY改變了變量的字符串拼接結果
    [Address] WHERE AddressID <=10;SELECT @address_list  但是,如果SQL多了一個排序操作,結果就變了,這個SQL的變量@address_list  但是你使用其它一些欄位排序的話,它又是OK的。在各種實際生產環境中,可能按某個欄位排序,字符串拼接就不正常了。但是按有些欄位排序又是正常的。有點搞不清套路。
  • python list 排序的兩種方法及實例講解
    對 list 進行排序,Python 提供了兩個方法:方法1.