最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的lambda和stream實現(xiàn)排序

 更新時間:2022年09月21日 11:21:10   作者:ldcaws  
這篇文章主要介紹了Java中的lambda和stream實現(xiàn)排序,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

前言

在日常開發(fā)中,對數(shù)據(jù)排序是非常常見的一種需求,一般通過如下兩種方式:

  • 存儲系統(tǒng):通過SQL、NoSQL的排序功能,查詢的結(jié)果是完成排序的結(jié)果;
  • 內(nèi)存:通過在內(nèi)存中進行排序,查詢的結(jié)果是無序的結(jié)果;

下面聊聊通過Java中的lambda和stream實現(xiàn)在內(nèi)存中對數(shù)據(jù)進行排序。

1、定義一個基礎(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類型的排序是通過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)));
    }

到此這篇關(guān)于Java中的lambda和stream實現(xiàn)排序的文章就介紹到這了,更多相關(guān)Java lambda和stream 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中使用print、printf、println的示例及區(qū)別

    Java中使用print、printf、println的示例及區(qū)別

    Java?的輸出方式一般有這三種,print、println、printf,它們都是?java.long?包里的System類中的方法,本文重點給大家介紹Java中使用print、printf、println的示例,需要的朋友可以參考下
    2023-05-05
  • Java中的字符型文件流FileReader和FileWriter詳細解讀

    Java中的字符型文件流FileReader和FileWriter詳細解讀

    這篇文章主要介紹了Java中的字符型文件流FileReader和FileWriter詳細解讀,與字節(jié)型文件流不同,字節(jié)型文件流讀取和寫入的都是一個又一個的字節(jié),而字符型文件流操作的單位是一個又一個的字符,字符型流認為一個字母是一個字符,而一個漢字也是一個字符,需要的朋友可以參考下
    2023-10-10
  • springBoot整合jwt實現(xiàn)token令牌認證的示例代碼

    springBoot整合jwt實現(xiàn)token令牌認證的示例代碼

    實施Token驗證的方法挺多的,還有一些標準方法,比如JWT,本文主要介紹了springBoot整合jwt實現(xiàn)token令牌認證的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • JavaMail發(fā)送(帶圖片和附件)和接收郵件實現(xiàn)詳解(四)

    JavaMail發(fā)送(帶圖片和附件)和接收郵件實現(xiàn)詳解(四)

    這篇文章主要為大家詳細介紹了JavaMail帶圖片和附件的發(fā)送和接收郵件實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • springboot創(chuàng)建的web項目整合Quartz框架的項目實踐

    springboot創(chuàng)建的web項目整合Quartz框架的項目實踐

    本文主要介紹了springboot創(chuàng)建的web項目整合Quartz框架的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • java數(shù)據(jù)結(jié)構(gòu)關(guān)于棧的實例應(yīng)用

    java數(shù)據(jù)結(jié)構(gòu)關(guān)于棧的實例應(yīng)用

    大家好,本篇文章主要講的是java數(shù)據(jù)結(jié)構(gòu)關(guān)于棧的實例應(yīng)用,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • mybatis-plus報錯Not Found TableInfoCache異常問題

    mybatis-plus報錯Not Found TableInfoCache異常問題

    在集成百度uid-generator過程中,MyBatis-Plus報錯NotFoundTableInfoCache異常,解決方法:檢查實體類是否繼承了官方model,確保實體類對應(yīng)的mapper已正確注入,在使用@Component注解時,應(yīng)保證相關(guān)依賴已注入
    2024-09-09
  • Spring Boot使用線程池創(chuàng)建多線程的完整示例

    Spring Boot使用線程池創(chuàng)建多線程的完整示例

    在 Spring Boot 2 中,可以使用 @Autowired 注入 線程池(ThreadPoolTaskExecutor 或 ExecutorService),從而管理線程的創(chuàng)建和執(zhí)行,以下是使用 @Autowired 方式注入線程池的完整示例,感興趣的朋友一起看看吧
    2025-03-03
  • Spring?@InitBinder注解使用及原理詳解

    Spring?@InitBinder注解使用及原理詳解

    這篇文章主要為大家介紹了Spring?@InitBinder注解使用及原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • vscode 配置java環(huán)境并調(diào)試運行的詳細過程

    vscode 配置java環(huán)境并調(diào)試運行的詳細過程

    這篇文章主要介紹了vscode 配置java環(huán)境并調(diào)試運行的詳細過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05

最新評論

潜山县| 来安县| 灵丘县| 泸州市| 石景山区| 章丘市| 黑山县| 乌什县| 敖汉旗| 华容县| 宁津县| 乐清市| 咸宁市| 健康| 云龙县| 蚌埠市| 南岸区| 江北区| 澄城县| 封丘县| 吉隆县| 南皮县| 明星| 清涧县| 阳朔县| 平阴县| 股票| 德钦县| 枣阳市| 武义县| 丹东市| 定陶县| 固安县| 安阳县| 日土县| 静海县| 叙永县| 淳化县| 武强县| 齐齐哈尔市| 博湖县|