Java中的lambda和stream實(shí)現(xiàn)排序
前言
在日常開(kāi)發(fā)中,對(duì)數(shù)據(jù)排序是非常常見(jiàn)的一種需求,一般通過(guò)如下兩種方式:
- 存儲(chǔ)系統(tǒng):通過(guò)SQL、NoSQL的排序功能,查詢的結(jié)果是完成排序的結(jié)果;
- 內(nèi)存:通過(guò)在內(nèi)存中進(jìn)行排序,查詢的結(jié)果是無(wú)序的結(jié)果;
下面聊聊通過(guò)Java中的lambda和stream實(shí)現(xiàn)在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行排序。
1、定義一個(gè)基礎(chǔ)類
@Data @NoArgsConstructor @AllArgsConstructor public class Student { private String name; private int age; @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); } }
2、使用Comparator排序
@Test void test() { List<Student> students = Lists.newArrayList( new Student("caocao", 21), new Student("sunquan", 20) ); Collections.sort(students, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName()); } }); Assertions.assertEquals(students.get(0), new Student("caocao", 21)); }
在定義的Comparator中使用name字段排序,string類型的排序是通過(guò)ASCII碼順序進(jìn)行判斷。
3、使用lambda排序
@Test void test() { List<Student> students = Lists.newArrayList( new Student("caocao", 21), new Student("sunquan", 20) ); students.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); Assertions.assertEquals(students.get(0), new Student("caocao", 21)); }
將內(nèi)部類Comparator替換為lambda表達(dá)式,使代碼更簡(jiǎn)潔。
4、使用Comparator的comparing方法排序
@Test void test() { List<Student> students = Lists.newArrayList( new Student("caocao", 21), new Student("sunquan", 20) ); students.sort(Comparator.comparing(Student::getName)); Assertions.assertEquals(students.get(0), new Student("caocao", 21)); }
5、自定義比對(duì)方法
在Student類中自定義比對(duì)方法
public static int compareByNameThenAge(Student s1, Student s2) { if (s1.name.equals(s2.name)) { return Integer.compare(s1.age, s2.age); } else { return s1.name.compareTo(s2.name); } }
先比對(duì)name,再比對(duì)age
@Test void test() { List<Student> students = Lists.newArrayList( new Student("caocao", 21), new Student("sunquan", 20) ); students.sort((o1,o2) -> Student.compareByNameThenAge(o1,o2)); Assertions.assertEquals(students.get(0), new Student("caocao", 21)); }
6、使用stream排序
在流式計(jì)算時(shí)進(jìn)行排序
@Test void test() { List<Student> students = Lists.newArrayList( new Student("caocao", 21), new Student("sunquan", 20) ); List<Student> result = students.stream().sorted(new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName()); } }).collect(Collectors.toList()); Assertions.assertEquals(result.get(0), new Student("caocao", 21)); }
7、null值判斷
若列表中元素是null或列表中元素參與排序的字段是null,會(huì)出現(xiàn)NullPointException異常,即 NPE,簡(jiǎn)單演示一下:
@Test void sortedNullGotNPE() { List<Student> students = Lists.newArrayList( null, new Student("liubei", 12) ); students.sort(Comparator.comparing(Student::getName)); }
修改為:
@Test void sortedNullGotNPE() { List<Student> students = Lists.newArrayList( null, new Student("liubei", 12) ); //students.sort(Comparator.comparing(Student::getName)); Assertions.assertThrows(NullPointerException.class, () -> students.sort(Comparator.comparing(Student::getName))); }
到此這篇關(guān)于Java中的lambda和stream實(shí)現(xiàn)排序的文章就介紹到這了,更多相關(guān)Java lambda和stream 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream
- Java的Lambda表達(dá)式和Stream流的作用以及示例
- Java分析Lambda表達(dá)式Stream流合并分組內(nèi)對(duì)象數(shù)據(jù)合并
- Java詳細(xì)分析Lambda表達(dá)式與Stream流的使用方法
- 吊打Java面試官之Lambda表達(dá)式 Stream API
- Java8中Lambda表達(dá)式使用和Stream API詳解
- 詳解Java遞歸實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的兩種方式
- Java實(shí)現(xiàn)樹(shù)形結(jié)構(gòu)的示例代碼
- Java樹(shù)形結(jié)構(gòu)數(shù)據(jù)生成導(dǎo)出excel文件方法記錄
- Java使用 Stream 流和 Lambda 組裝復(fù)雜父子樹(shù)形結(jié)構(gòu)
相關(guān)文章
如何在Java中調(diào)用python文件執(zhí)行詳解
豐富的第三方庫(kù)使得python非常適合用于進(jìn)行數(shù)據(jù)分析,最近在項(xiàng)目中就涉及到j(luò)ava調(diào)用python實(shí)現(xiàn)的算法,下面這篇文章主要給大家介紹了關(guān)于如何在Java中調(diào)用python文件執(zhí)行的相關(guān)資料,需要的朋友可以參考下2022-05-05json如何解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去
這篇文章主要介紹了json解析混合數(shù)組對(duì)象到實(shí)體類的list集合里去的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式
項(xiàng)目中,經(jīng)常需要在啟動(dòng)過(guò)程中初始化一些數(shù)據(jù),如從數(shù)據(jù)庫(kù)讀取一些配置初始化,或從數(shù)據(jù)庫(kù)讀取一些熱點(diǎn)數(shù)據(jù)到redis進(jìn)行初始化緩存,本文給大家介紹了SpringBoot啟動(dòng)時(shí)執(zhí)行初始化操作的幾種方式的相關(guān)資料,需要的朋友可以參考下2024-05-05Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查操作
這篇文章主要介紹了Springboot引入hibernate配置自動(dòng)建表并進(jìn)行增刪改查,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09修改jar包package目錄結(jié)構(gòu)操作方法
這篇文章主要介紹了修改jar包package目錄結(jié)構(gòu)操作方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作
這篇文章主要介紹了Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06