Java字段Stream排序常用方式

 更新时间:2023年09月28日 08:55:49   作者:张志帅‍  
这篇文章主要给大家介绍了关于Java字段Stream排序常用方式的相关资料,我们在处理数据的时候经常会需要进行排序后再返回给前端调用,比如按照时间升序排序,前端展示数据就是按时间先后进行排序,需要的朋友可以参考下

这篇博客简单记录下 Java 字段 Stream 排序常用方式,欢迎阅读斧正。

用到的类如下:

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

准备数据:

        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() 之后的结果是对 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())

添加对照数据

        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}

总结

到此这篇关于Java字段Stream排序常用方式的文章就介绍到这了,更多相关Java字段Stream排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Maven项目pom.xml导入了Junit包还是用不了@Test注解问题

    解决Maven项目pom.xml导入了Junit包还是用不了@Test注解问题

    在Maven项目中,如果在非test目录下使用@Test注解,可能会因为pom.xml中<scope>test</scope>的设置而无法使用,正确做法是将测试代码放在src/test/java目录下,或去除<scope>test</scope>限制,这样可以确保Junit依赖正确加载并应用于适当的代码部分
    2024-10-10
  • 浅谈Java关闭线程池shutdown和shutdownNow的区别

    浅谈Java关闭线程池shutdown和shutdownNow的区别

    本文主要介绍了Java关闭线程池shutdown和shutdownNow的区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • springboot集成微软teams的实例代码

    springboot集成微软teams的实例代码

    Microsoft Teams 是一款基于聊天的智能团队协作工具,可以同步进行文档共享,并为成员提供包括语音、视频会议在内的即时通讯工具,今天给大家介绍springboot集成微软teams的示例代码,感兴趣的朋友一起看看吧
    2022-01-01
  • Java Math.round函数详解

    Java Math.round函数详解

    这篇文章主要介绍了Java Math.round函数详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • spring boot 实现一个 禁止重复请求的方法

    spring boot 实现一个 禁止重复请求的方法

    这篇文章主要介绍了spring boot 实现一个 禁止重复请求,当重复请求该方法时,会返回"Duplicate request",避免重复执行相同的操作,需要的朋友可以参考下
    2024-03-03
  • mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

    mybatis-plus用insertBatchSomeColumn方法批量新增指定字段

    mybatisPlus底层的新增方法是一条一条的新增的,下面这篇文章主要给大家介绍了关于mybatis-plus用insertBatchSomeColumn方法批量新增指定字段的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • MyBatis拦截器动态替换表名的方法详解

    MyBatis拦截器动态替换表名的方法详解

    因为我们持久层框架更多地使用MyBatis,那我们就借助于MyBatis的拦截器来完成我们的功能,这篇文章主要给大家介绍了关于MyBatis拦截器动态替换表名的相关资料,需要的朋友可以参考下
    2022-04-04
  • Java pdu短信解码全面解析

    Java pdu短信解码全面解析

    本文是根据python的方法改写的pdu短信解码,非常不错,代码简单易懂具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-10-10
  • POI通过模板导出EXCEL文件的实例

    POI通过模板导出EXCEL文件的实例

    下面小编就为大家带来一篇POI通过模板导出EXCEL文件的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • springboot+redis实现简单的热搜功能

    springboot+redis实现简单的热搜功能

    这篇文章主要介绍了springboot+redis实现一个简单的热搜功能,通过代码介绍了过滤不雅文字的过滤器,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论