Java中的lambda和stream實現(xiàn)排序
前言
在日常開發(fā)中,對數(shù)據(jù)排序是非常常見的一種需求,一般通過如下兩種方式:
- 存儲系統(tǒng):通過SQL、NoSQL的排序功能,查詢的結果是完成排序的結果;
- 內(nèi)存:通過在內(nèi)存中進行排序,查詢的結果是無序的結果;
下面聊聊通過Java中的lambda和stream實現(xiàn)在內(nèi)存中對數(shù)據(jù)進行排序。
1、定義一個基礎類
@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類型的排序是通過ASCII碼順序進行判斷。
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表達式,使代碼更簡潔。
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、自定義比對方法
在Student類中自定義比對方法
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);
}
}先比對name,再比對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排序
在流式計算時進行排序
@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,會出現(xiàn)NullPointException異常,即 NPE,簡單演示一下:
@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)));
}到此這篇關于Java中的lambda和stream實現(xiàn)排序的文章就介紹到這了,更多相關Java lambda和stream 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 一文帶你徹底了解Java8中的Lambda,函數(shù)式接口和Stream
- Java的Lambda表達式和Stream流的作用以及示例
- Java分析Lambda表達式Stream流合并分組內(nèi)對象數(shù)據(jù)合并
- Java詳細分析Lambda表達式與Stream流的使用方法
- 吊打Java面試官之Lambda表達式 Stream API
- Java8中Lambda表達式使用和Stream API詳解
- 詳解Java遞歸實現(xiàn)樹形結構的兩種方式
- Java實現(xiàn)樹形結構的示例代碼
- Java樹形結構數(shù)據(jù)生成導出excel文件方法記錄
- Java使用 Stream 流和 Lambda 組裝復雜父子樹形結構
相關文章
如何在Java中調(diào)用python文件執(zhí)行詳解
豐富的第三方庫使得python非常適合用于進行數(shù)據(jù)分析,最近在項目中就涉及到java調(diào)用python實現(xiàn)的算法,下面這篇文章主要給大家介紹了關于如何在Java中調(diào)用python文件執(zhí)行的相關資料,需要的朋友可以參考下2022-05-05
json如何解析混合數(shù)組對象到實體類的list集合里去
這篇文章主要介紹了json解析混合數(shù)組對象到實體類的list集合里去的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringBoot啟動時執(zhí)行初始化操作的幾種方式
項目中,經(jīng)常需要在啟動過程中初始化一些數(shù)據(jù),如從數(shù)據(jù)庫讀取一些配置初始化,或從數(shù)據(jù)庫讀取一些熱點數(shù)據(jù)到redis進行初始化緩存,本文給大家介紹了SpringBoot啟動時執(zhí)行初始化操作的幾種方式的相關資料,需要的朋友可以參考下2024-05-05
Springboot引入hibernate配置自動建表并進行增刪改查操作
這篇文章主要介紹了Springboot引入hibernate配置自動建表并進行增刪改查,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作
這篇文章主要介紹了Spring Boot使用AOP在指定方法執(zhí)行完后執(zhí)行異步處理操作,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2024-06-06

