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

Java字段Stream排序常用方式

 更新時間:2023年09月28日 08:55:49   作者:張志帥?  
這篇文章主要給大家介紹了關(guān)于Java字段Stream排序常用方式的相關(guān)資料,我們在處理數(shù)據(jù)的時候經(jīng)常會需要進(jìn)行排序后再返回給前端調(diào)用,比如按照時間升序排序,前端展示數(shù)據(jù)就是按時間先后進(jìn)行排序,需要的朋友可以參考下

這篇博客簡單記錄下 Java 字段 Stream 排序常用方式,歡迎閱讀斧正。

用到的類如下:

public class OrderTest {
    private String channelCode;
    private BigDecimal rate;
    // 省略 getter、setter、toString()、constructor
}

準(zhǔn)備數(shù)據(jù):

        List<OrderTest> orderTestList = new ArrayList<>();
        OrderTest z09 = new OrderTest("Z09", new BigDecimal("7.6677"));
        OrderTest B2C = new OrderTest("B2C", new BigDecimal("5.6666"));
        OrderTest Z04 = new OrderTest("Z04", new BigDecimal("4.3137"));
        OrderTest ALL = new OrderTest("ALL", new BigDecimal("4.3137"));
        OrderTest ALL1 = new OrderTest("ALL", new BigDecimal("4.5137"));
        // 演示多字段排序使用
        OrderTest z091 = new OrderTest("Z09", new BigDecimal("7.6671"));
        // 演示給 null 值排序用
        OrderTest z092 = new OrderTest("Z09", null);
        OrderTest B2C1 = new OrderTest("B2C", new BigDecimal("5.6666"));
        OrderTest Z041 = new OrderTest("Z04", null);
        orderTestList.add(z09);
        orderTestList.add(z091);
        orderTestList.add(B2C);
        orderTestList.add(Z04);
        orderTestList.add(ALL);
        orderTestList.add(ALL1);

單字段

升序使用 .sorted(Comparator.Comparing(YourClass::Class's Field) 就行,降序使用 .sorted(Comparator.Comparing(YourClass::Class's Field, Comparator.reverseOrder())。

        System.out.println("----------------------------------------------");
        System.out.println("只按照 channelCode 升序排序:");
        List<OrderTest> channelAsc =
                orderTestList.stream()
                        .sorted(Comparator.comparing(OrderTest::getChannelCode))
                        .collect(Collectors.toList());
        channelAsc.forEach(System.out::println);
        System.out.println("----------------------------------------------");
        System.out.println("只按照 channelCode 降序排序:");
        List<OrderTest> channelDesc =
                orderTestList.stream()
                        .sorted(Comparator.comparing(OrderTest::getChannelCode, Comparator.reverseOrder()))
                        .collect(Collectors.toList());
        channelDesc.forEach(System.out::println);

輸出:

----------------------------------------------
只按照 channelCode 升序排序:
OrderTest{channelCode='ALL', rate=4.3137}
OrderTest{channelCode='ALL', rate=4.5137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='Z09', rate=7.6677}
OrderTest{channelCode='Z09', rate=7.6671}
----------------------------------------------
只按照 channelCode 降序排序:
OrderTest{channelCode='Z09', rate=7.6677}
OrderTest{channelCode='Z09', rate=7.6671}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='ALL', rate=4.3137}
OrderTest{channelCode='ALL', rate=4.5137}

多字段

利用的是 thenComparing():升序 thenComparing(YourClass::Class's Field),降序 thenComparing(YourClass::Class's Field, Comparator.reverseOrder())。

注意: 使用 thenComparing(YourClass::Class's Field).reversed() 的時候要注意排序要求,如果先按照 A 字段升序 B 字段升序的話,使用 reversed() 之后的結(jié)果是對 A 降序 B 降序。

不對 null 值處理

先按照 channelCode 升序,再按照 rate 升序排序:

        System.out.println("----------------------------------------------");
        System.out.println("先按照 channelCode 升序,再按照 rate 升序排序:");
        List<OrderTest> channelCodeAscRateAscList =
                orderTestList.stream()
                        .sorted(Comparator.comparing(OrderTest::getChannelCode)
                                .thenComparing(OrderTest::getRate))
                        .collect(Collectors.toList());
        channelCodeAscRateAscList.forEach(System.out::println);

輸出:

----------------------------------------------
先按照 channelCode 升序,再按照 rate 升序排序:
OrderTest{channelCode='ALL', rate=4.3137}
OrderTest{channelCode='ALL', rate=4.5137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='Z09', rate=7.6671}
OrderTest{channelCode='Z09', rate=7.6677}

先按照 channelCode 升序,再按照 rate 升序排序,使用 reversed():

        System.out.println("----------------------------------------------");
        System.out.println("先按照 channelCode 升序,再按照 rate 升序排序,使用 reversed():");
        List<OrderTest> channelCodeAscRateAscWithReversedList =
                orderTestList.stream()
                        .sorted(Comparator.comparing(OrderTest::getChannelCode)
                                .thenComparing(OrderTest::getRate).reversed())
                        .collect(Collectors.toList());
        channelCodeAscRateAscWithReversedList.forEach(System.out::println);

輸出:

----------------------------------------------
先按照 channelCode 升序,再按照 rate 升序排序,使用 reversed():
OrderTest{channelCode='Z09', rate=7.6677}
OrderTest{channelCode='Z09', rate=7.6671}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='ALL', rate=4.5137}
OrderTest{channelCode='ALL', rate=4.3137}

先按照 channelCode 升序,再按照 rate 降序排序:

        System.out.println("----------------------------------------------");
        System.out.println("先按照 channelCode 升序,再按照 rate 降序排序:");
        List<OrderTest> channelCodeAscRateDescList =
                orderTestList.stream()
                        .sorted(Comparator.comparing(OrderTest::getChannelCode)
                                .thenComparing(OrderTest::getRate, Comparator.reverseOrder()))
                        .collect(Collectors.toList());
        channelCodeAscRateDescList.forEach(System.out::println);

輸出:

----------------------------------------------
先按照 channelCode 升序,再按照 rate 降序排序:
OrderTest{channelCode='ALL', rate=4.5137}
OrderTest{channelCode='ALL', rate=4.3137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='Z09', rate=7.6677}
OrderTest{channelCode='Z09', rate=7.6671}

對 null 值處理

只演示第二個字段,排序方式為倒序,用到了 Comparator.nullsLast(Comparator.reverseOrder()) 以及 Comparator.nullsLast(Comparator.reverseOrder())。

添加對照數(shù)據(jù)

        orderTestList.add(z092);
        orderTestList.add(B2C1);
        orderTestList.add(Z041);        

先按照 channelCode 升序,再按照 rate 降序并且 null 值放前面排序:

        System.out.println("----------------------------------------------");
        System.out.println("先按照 channelCode 升序,再按照 rate 降序并且 null 值放前面排序:");
        List<OrderTest> channelCodeAscRateDescNullFirstList = orderTestList.stream()
                .sorted(Comparator.comparing(OrderTest::getChannelCode)
                        .thenComparing(OrderTest::getRate, Comparator.nullsFirst(Comparator.reverseOrder())))
                .collect(Collectors.toList());
        channelCodeAscRateDescNullFirstList.forEach(System.out::println);

輸出:

----------------------------------------------
先按照 channelCode 升序,再按照 rate 降序并且 null 值放前面排序:
OrderTest{channelCode='ALL', rate=4.5137}
OrderTest{channelCode='ALL', rate=4.3137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='Z04', rate=null}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='Z09', rate=null}
OrderTest{channelCode='Z09', rate=7.6677}
OrderTest{channelCode='Z09', rate=7.6671}

先按照 channelCode 升序,再按照 rate 降序并且 null 值放后面排序:

        System.out.println("----------------------------------------------");
        System.out.println("先按照 channelCode 升序,再按照 rate 降序并且 null 值放后面排序:");
        List<OrderTest> channelCodeAscRateDescNullLastList = orderTestList.stream()
                .sorted(Comparator.comparing(OrderTest::getChannelCode)
                        .thenComparing(OrderTest::getRate, Comparator.nullsLast(Comparator.reverseOrder())))
                .collect(Collectors.toList());
        channelCodeAscRateDescNullLastList.forEach(System.out::println);

輸出:

----------------------------------------------
先按照 channelCode 升序,再按照 rate 降序并且 null 值放后面排序:
OrderTest{channelCode='ALL', rate=4.5137}
OrderTest{channelCode='ALL', rate=4.3137}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='B2C', rate=5.6666}
OrderTest{channelCode='Z04', rate=4.3137}
OrderTest{channelCode='Z04', rate=null}
OrderTest{channelCode='Z09', rate=7.6677}
OrderTest{channelCode='Z09', rate=7.6671}
OrderTest{channelCode='Z09', rate=null}

總結(jié)

到此這篇關(guān)于Java字段Stream排序常用方式的文章就介紹到這了,更多相關(guān)Java字段Stream排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中實現(xiàn)對象深克隆的四種方式

    Java中實現(xiàn)對象深克隆的四種方式

    這篇文章主要介紹了如何在Java中實現(xiàn)對象的深克隆,可以通過手動實現(xiàn)clone()方法、使用序列化、第三方庫Apache Commons Lang或Hutool等幾種方式,每種方式都有其特點,需要的朋友可以參考下
    2025-10-10
  • Java中死鎖的原理實戰(zhàn)分析

    Java中死鎖的原理實戰(zhàn)分析

    這篇文章主要介紹了Java中死鎖的原理,結(jié)合具體案例形式分析了java死鎖形成的相關(guān)原理,需要的朋友可以參考下
    2019-08-08
  • 將Java程序打包成.exe文件的完整指南

    將Java程序打包成.exe文件的完整指南

    這篇文章主要為大家詳細(xì)介紹了將Java程序打包成.exe文件的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-03-03
  • 詳解Spring?延遲初始化遇到的問題

    詳解Spring?延遲初始化遇到的問題

    這篇文章主要介紹了我們在使用Spring延遲初始化容易遇到的問題,文中有詳細(xì)的代碼示例,具有一定的參考價值,需要的可以借鑒一下
    2023-05-05
  • 深入理解可視化JVM 故障處理工具

    深入理解可視化JVM 故障處理工具

    這篇文章主要介紹了深入理解可視化JVM 故障處理工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java使用pdfbox實現(xiàn)給pdf文件加圖片水印

    Java使用pdfbox實現(xiàn)給pdf文件加圖片水印

    有時候需要給pdf加水印,市面上工具都是收費(fèi)的要會員,還是自食其力吧;嘗試過 spire.pdf.free 那個超過10頁就不行了!所以本文還是使用了pdfbox,感興趣的可以了解一下
    2022-11-11
  • 5分鐘搞定java單例模式

    5分鐘搞定java單例模式

    單例模式(Singleton?Pattern)是?Java?中最簡單的設(shè)計模式之一。這種類型的設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式,本文給大家介紹下java單例模式的相關(guān)知識,感興趣的朋友一起看看吧
    2022-03-03
  • 為了多次讀取ServletInputStream引發(fā)的一系列問題

    為了多次讀取ServletInputStream引發(fā)的一系列問題

    這篇文章主要介紹了為了多次讀取ServletInputStream引發(fā)的一系列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java手寫線程池之向JDK線程池進(jìn)發(fā)

    Java手寫線程池之向JDK線程池進(jìn)發(fā)

    在前面的文章自己動手寫乞丐版線程池中,我們寫了一個非常簡單的線程池實現(xiàn),這個只是一個非常簡單的實現(xiàn),在本篇文章當(dāng)中我們將要實現(xiàn)一個和JDK內(nèi)部實現(xiàn)的線程池非常相似的線程池,需要的可以了解一下
    2022-10-10
  • SpringBoot獲取真實客戶端IP的正確方法

    SpringBoot獲取真實客戶端IP的正確方法

    在日常開發(fā)中,獲取客戶端IP看似簡單,實則暗藏玄機(jī),很多開發(fā)者直接使用request.getRemoteAddr(),結(jié)果在生產(chǎn)環(huán)境中發(fā)現(xiàn)獲取到的都是負(fù)載均衡器的IP,而非真實用戶IP,本文將徹底揭秘Spring Boot中獲取真實客戶端IP的正確姿勢,需要的朋友可以參考下
    2026-03-03

最新評論

永定县| 博客| 长寿区| 拜城县| 禹城市| 乳源| 洛阳市| 龙陵县| 江油市| 闻喜县| 林州市| 利辛县| 日照市| 班戈县| 湖北省| 沙坪坝区| 罗源县| 辽中县| 石河子市| 乌拉特中旗| 安义县| 内黄县| 高尔夫| 寿光市| 瑞安市| 峨眉山市| 尼勒克县| 永靖县| 共和县| 滨海县| 黔东| 易门县| 炎陵县| 武平县| 新蔡县| 二连浩特市| 金寨县| 西畴县| 泰来县| 冕宁县| 馆陶县|