JAVA像SQL一樣對(duì)List對(duì)象集合進(jìn)行排序
在開(kāi)始之前,我先賣(mài)個(gè)關(guān)子提一個(gè)問(wèn)題:假設(shè)我們有一個(gè)Movie類(lèi),這個(gè)類(lèi)有三個(gè)成員變量分別是starred(是否收藏), title(電影名稱(chēng)), rating(評(píng)分)。你知道怎么對(duì)一個(gè)Movie對(duì)象組成的List集合,先按照是否收藏字段倒序排序,再按照評(píng)分的倒序進(jìn)行排序么?如果您不知道4行代碼以?xún)?nèi)的解決方案(其實(shí)是1行代碼就可以實(shí)現(xiàn),但筆者格式化為4行),我覺(jué)得您有必要一步步的看下去。
在java 8 之前,實(shí)現(xiàn)對(duì)象Collection排序,集合中被排序和比較大小的對(duì)象得實(shí)現(xiàn)Comparable接口。在java 8之后,有了Comparator比較器的概念,使用Comparator完成對(duì)象數(shù)組的排序更加方便快捷,下面就給大家簡(jiǎn)單的介紹一下java 8中使用Comparator排序的方法。
一、字符串List排序

- cities是一個(gè)字符串?dāng)?shù)組。注意london的首字母是小寫(xiě)的。
- 當(dāng)使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小寫(xiě)不敏感)的規(guī)則排序,結(jié)果是:[london, Milan, New Delhi, San Francisco, Tokyo]
- 如果使用Comparator.naturalOrder()字母自然順序排序,結(jié)果是:[Milan, New Delhi, San Francisco, Tokyo, london]
在java 7我們是使用Collections.sort()接受一個(gè)數(shù)組參數(shù),對(duì)數(shù)組進(jìn)行排序。在java 8之后可以直接調(diào)用集合類(lèi)的sort()方法進(jìn)行排序。sort()方法可以傳入一個(gè)字符串的排序規(guī)則,如:String.CASE_INSENSITIVE_ORDER,也可以傳入一個(gè)排序器Comparator.naturalOrder()作為參數(shù)。
二、整數(shù)類(lèi)型List排序

按數(shù)字的自然順序排序,結(jié)果是[1, 2, 4, 6, 9]
三、按對(duì)象字段對(duì)對(duì)象List排序
這個(gè)功能就比較有意思了,舉個(gè)例子大家理解一下。假設(shè)我們有一個(gè)類(lèi)Movie,有三個(gè)成員變量分別是starred(是否收藏), title(電影名稱(chēng)), rating(評(píng)分)。

- 首先,我們創(chuàng)建了四個(gè)Movie對(duì)象,然后將它們轉(zhuǎn)換為L(zhǎng)ist
- 然后重點(diǎn)的的代碼:使用了函數(shù)應(yīng)用Movie::getTitle作為對(duì)象的排序字段,即按照電影的title作為排序字段
- 然后調(diào)用List的forEach方法將List排序結(jié)果打印出來(lái),如下(當(dāng)然我們重寫(xiě)了toString方法,不然打印結(jié)果沒(méi)有意義):

- 如果我們希望List按照Title的倒序排序,就使用reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。
四、使用自定義Comparator排序
我們自定義一個(gè)排序器,實(shí)現(xiàn)compare函數(shù)。返回0表示元素相等,-1表示前一個(gè)元素小于后一個(gè)元素,1表示前一個(gè)元素大于后一個(gè)元素。這個(gè)規(guī)則似乎和java 8之前沒(méi)什么區(qū)別。

最終的打印結(jié)果如下,按照started的自定義規(guī)則進(jìn)行排序。

這段代碼如果以lambda表達(dá)式簡(jiǎn)寫(xiě)。箭頭左側(cè)是參數(shù),右側(cè)是函數(shù)體,參數(shù)類(lèi)型和返回值根據(jù)上下文自動(dòng)判斷。如下:

五、通過(guò)Comparator鏈對(duì)對(duì)象List排序

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

以上就是JAVA像SQL一樣對(duì)List對(duì)象集合進(jìn)行排序的詳細(xì)內(nèi)容,更多關(guān)于JAVA 對(duì)list集合排序的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Java8 使用 stream().sorted()對(duì)List集合進(jìn)行排序的操作
- Java如何實(shí)現(xiàn)List自定義排序
- java list集合排序按某一屬性排序操作
- 如何基于Java實(shí)現(xiàn)對(duì)象List排序
- Java List集合排序?qū)崿F(xiàn)方法解析
- Java使用Collections工具類(lèi)對(duì)List集合進(jìn)行排序
- java8新特性將List中按指定屬性排序過(guò)濾重復(fù)數(shù)據(jù)的方法
- Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn)
- Java實(shí)現(xiàn)對(duì)兩個(gè)List快速去重并排序操作示例
- Java中對(duì)list map根據(jù)map某個(gè)key值進(jìn)行排序的方法
- Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法
- Java基礎(chǔ)之List內(nèi)元素的排序性能對(duì)比
相關(guān)文章
java 開(kāi)發(fā)使用字符串和數(shù)字的性能分析
這篇文章主要介紹了java 開(kāi)發(fā)使用字符串和數(shù)字的性能分析的相關(guān)資料,需要的朋友可以參考下2017-07-07
springboot版本升級(jí)以及解決springsecurity漏洞的問(wèn)題
這篇文章主要介紹了springboot版本升級(jí)以及解決springsecurity漏洞的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Java-ElementUi中的row-class-name使用
這篇文章主要介紹了Java-ElementUi中的row-class-name使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
SpringBoot中Date格式化處理的三種實(shí)現(xiàn)
Spring Boot作為一個(gè)簡(jiǎn)化Spring應(yīng)用開(kāi)發(fā)的框架,提供了多種處理日期格式化的方法,本文主要介紹了SpringBoot中Date格式化處理實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
基于Map的computeIfAbsent的使用場(chǎng)景和使用方式
這篇文章主要介紹了基于Map的computeIfAbsent的使用場(chǎng)景和使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java把Map轉(zhuǎn)為對(duì)象的實(shí)現(xiàn)代碼
在項(xiàng)目開(kāi)發(fā)中,經(jīng)常碰到map轉(zhuǎn)實(shí)體對(duì)象或者對(duì)象轉(zhuǎn)map的場(chǎng)景,工作中,很多時(shí)候我們可能比較喜歡使用第三方j(luò)ar包的API對(duì)他們進(jìn)行轉(zhuǎn)化,但這里,我想通過(guò)反射的方式對(duì)他們做轉(zhuǎn)化,感興趣的同學(xué)跟著小編來(lái)看看吧2023-08-08
SpringBoot整合Redis實(shí)現(xiàn)刷票過(guò)濾功能
隨著互聯(lián)網(wǎng)的不斷發(fā)展,網(wǎng)站或APP的用戶(hù)流量增加,也衍生出了一些惡意刷量等問(wèn)題,給數(shù)據(jù)分析及運(yùn)營(yíng)帶來(lái)極大的困難,所以本文使用SpringBoot和Redis實(shí)現(xiàn)一個(gè)刷票過(guò)濾功能,需要的可以參考一下2023-06-06
Java訪問(wèn)者模式實(shí)現(xiàn)優(yōu)雅的對(duì)象結(jié)構(gòu)處理
Java訪問(wèn)者模式是一種行為型設(shè)計(jì)模式,它通過(guò)將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作分離,實(shí)現(xiàn)對(duì)復(fù)雜對(duì)象結(jié)構(gòu)的處理。它將數(shù)據(jù)結(jié)構(gòu)中的每個(gè)元素都轉(zhuǎn)換為訪問(wèn)者能夠識(shí)別的形式,從而使得數(shù)據(jù)操作可以在不影響數(shù)據(jù)結(jié)構(gòu)的前提下進(jìn)行擴(kuò)展和變化2023-04-04

