Java中如何給List進(jìn)行排序(這7種方法輕松實(shí)現(xiàn))
前言
在Java中我們經(jīng)常需要對(duì) ArrayList、LinkedList 或 CopyOnWriteArrayList 等列表進(jìn)行排序,在Java8出現(xiàn)之前,排序雖然能夠?qū)崿F(xiàn),但是代碼寫起來不是很優(yōu)雅,而且性能上也沒有什么優(yōu)勢(shì)。Java 8 及其以后之后,引入了 Lambda 表達(dá)式和方法引用,可以根據(jù)不同的條件以不同的順序?qū)?duì)象列表進(jìn)行排序,Comparator API 的增強(qiáng)功能也使 Java 中的對(duì)象比較和排序變得更加容易。
在本文,我將介紹如何使用 Lambda 表達(dá)式和方法引用對(duì) ArrayList 等 List 進(jìn)行排序,我將介紹7種方法,下面就直接進(jìn)入代碼實(shí)戰(zhàn)。
在開始介紹前,我們先新建一個(gè)學(xué)生類Student類,作為L(zhǎng)ist中的對(duì)象:
Student:
package com.test.javaroads.java8sort; import lombok.Data; /** * @author: javaroads * @date: 2022/11/22 22:06 * @description: 學(xué)生類 */ @Data @AllArgsConstructor public class Student { /** * 學(xué)生ID */ private String sid; /** * 學(xué)生姓名 */ private String name; /** * 學(xué)生年齡 */ private Integer age; /** * 性別 */ private String gender; /** * 所屬班級(jí) */ private String className; }
如上代碼,新建了Stdent類,屬性有:學(xué)生ID(sid)、學(xué)生姓名(name)、學(xué)生年齡(age)、性別(gender)、所屬班級(jí)(className)。
方法一
在Java8之前,沒有l(wèi)ambda表達(dá)式,一般都是java.util包中的Collections.sort()
方法,代碼如下:
package com.test.javaroads.java8sort; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** * @author: javaroads * @date: 2022/11/22 22:12 * @description: 排序方法 */ public class Sort { public static void main(String[] args) { List<Student> studentList = Arrays.asList( new Student("s1", "小李", 18, "女", "一班"), new Student("s2", "小王", 20, "男", "三班"), new Student("s3", "小張", 19, "男", "四班"), new Student("s4", "小汪", 19, "男", "二班")); System.out.println("排序前"); studentList.forEach(System.out::println); // 方法一:Java8之前,不用lambda表達(dá)式 Collections.sort(studentList, new Comparator<Student>() { @Override public int compare(Student student1, Student student2) { return student1.getAge() - student2.getAge(); } }); // 用forEach打印出排序后的list System.out.println("排序后的list:"); studentList.forEach(System.out::println); } }
打印結(jié)果:
如上代碼所示,成功使用Collections.sort()
方法將學(xué)生列表根據(jù)年齡排好序了。
方法二
在Java8中,可以利用lambda表達(dá)式進(jìn)行排序:
// 方法二:Java8中使用lambda表達(dá)式 Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));
打印結(jié)果:
如上代碼所示,成功使用Collections.sort(studentList, (student1, student2) -> student1.getClassName().compareTo(student2.getClassName()));
lambda表達(dá)式將學(xué)生列表根據(jù)班級(jí)排好序了。
方法三
可以使用類型推斷增強(qiáng)lambda表達(dá)式,代碼如下:
// 方法三:通過類型推斷增強(qiáng)lambda表達(dá)式 Collections.sort(studentList, (student1, student2) -> student1.getAge() - student2.getAge());
打印結(jié)果:
如上代碼所示,通過類型推斷增強(qiáng)lambda表達(dá)式將學(xué)生列表根據(jù)學(xué)生年齡排好序了。
方法四
可以通過lambda表達(dá)式結(jié)合靜態(tài)方法引用進(jìn)行排序,所以需要在Student中增加靜態(tài)方法:
/** * 根據(jù)年齡對(duì)學(xué)生進(jìn)行排序 * * @param student1 學(xué)生1 * @param student2 學(xué)生2 * @return 數(shù)字 */ public static int compareByAge(Student student1, Student student2) { return student1.getAge().compareTo(student2.getAge()); }
// 方法四:通過lambda表達(dá)式結(jié)合靜態(tài)方法引用 Collections.sort(studentList, Student::compareByAge);
打印結(jié)果:
如上代碼,我們先是在Student類中增加了compareByAge的靜態(tài)方法,然后結(jié)合lambda表達(dá)式成功進(jìn)行了排序。
方法五
可以通過Comaprator的comparing()方法進(jìn)行排序:
// 方法五:通過使用Comaprator的comparing()方法 Collections.sort(studentList, Comparator.comparing(Student::getAge));
打印結(jié)果:
如上代碼,我們通過Comaprator的comparing()方法成功進(jìn)行了排序。
方法六
可以通過以下代碼實(shí)現(xiàn)倒敘排序:
// 方法六:lambda倒敘 Comparator<Student> compare = (student1, student2) -> student1.getAge() - student2.getAge(); Collections.sort(studentList, compare.reversed());
打印結(jié)果:
可以看到,我們成功的通過reversed()方法實(shí)現(xiàn)了倒序排序。
方法七
當(dāng)排序條件非常多的時(shí)候應(yīng)該怎么做?要善于使用lambda表達(dá)式:
// 方法七:多條件排序 Collections.sort(studentList, (student1, student2) -> { if (student1.getGender().equals(student2.getGender())) { return student1.getAge() - student2.getAge(); } else { return student1.getClassName().compareTo(student2.getClassName()); } });
打印結(jié)果:
可以看出,不管條件多么多,只要使用lambda表達(dá)式,結(jié)合if表達(dá)式靈活實(shí)現(xiàn)了列表多條件的排序功能。
總結(jié)
以上我介紹了7種列表排序的方法,在 Java 8 之前,我們使用 for-each 循環(huán)遍歷 List 并打印列表的每個(gè)內(nèi)容,Java 8以后就可以使用forEach() 方法對(duì)于lambdas的應(yīng)用非常實(shí)用。
從文中介紹的排序方法,可以看出在 Java 8 中使用 lambda 表達(dá)式對(duì)列表進(jìn)行排序會(huì)使得代碼簡(jiǎn)潔且富有表現(xiàn)力,希望大家在遇到排序場(chǎng)景的時(shí)候,多使用lambda 表達(dá)式。
到此這篇關(guān)于Java中如何給List進(jìn)行排序的文章就介紹到這了,更多相關(guān)Java給List排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot集成nacos實(shí)現(xiàn)自動(dòng)刷新的示例代碼
研究nacos時(shí)發(fā)現(xiàn),springboot版本可使用@NacosValue實(shí)現(xiàn)配置的自動(dòng)刷新,本文主要介紹了springboot集成nacos實(shí)現(xiàn)自動(dòng)刷新的示例代碼,感興趣的可以了解一下2023-11-11mybatisplus?@Select注解中拼寫動(dòng)態(tài)sql異常問題的解決
這篇文章主要介紹了mybatisplus?@Select注解中拼寫動(dòng)態(tài)sql異常問題的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署
這篇文章主要為大家介紹了在Java項(xiàng)目中實(shí)現(xiàn)CI/CD持續(xù)集成與持續(xù)部署詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實(shí)現(xiàn)單調(diào)棧示例
這篇文章主要為大家介紹了特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實(shí)現(xiàn)單調(diào)棧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09java8新特性-lambda表達(dá)式入門學(xué)習(xí)心得
這篇文章主要介紹了java8新特性-lambda表達(dá)式入門學(xué)習(xí)心得,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))
這篇文章主要介紹了java快速解析路徑中的參數(shù)(&與=拼接的參數(shù)),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-02-02