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排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java Swing GridBagLayout网格袋布局的实现

    Java Swing GridBagLayout网格袋布局的实现

    这篇文章主要介绍了Java Swing GridBagLayout网格袋布局的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • SpringBoot中验证用户上传的图片资源的方法

    SpringBoot中验证用户上传的图片资源的方法

    这篇文章主要介绍了在SpringBoot中验证用户上传的图片资源,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • RedisTemplate中opsForValue和opsForList方法的使用详解

    RedisTemplate中opsForValue和opsForList方法的使用详解

    这篇文章主要介绍了RedisTemplate中opsForValue和opsForList方法的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • JAVA面向对象之继承 super入门解析

    JAVA面向对象之继承 super入门解析

    在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么引用里面的父类对象呢?用super来引用,this指当前对象的引用,super是当前对象里面的父对象的引用
    2022-01-01
  • mybatis 返回Map类型key默认为大写问题

    mybatis 返回Map类型key默认为大写问题

    这篇文章主要介绍了mybatis 返回Map类型key默认为大写问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • java实现批量导入.csv文件到mysql数据库

    java实现批量导入.csv文件到mysql数据库

    这篇文章主要为大家详细介绍了java实现批量导入.csv文件到mysql数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • spring通过jdbc连接数据库

    spring通过jdbc连接数据库

    这篇文章主要为大家详细介绍了spring通过jdbc连接数据库的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java 停止线程需要注意的地方

    Java 停止线程需要注意的地方

    这篇文章主要介绍了Java 停止线程需要注意的地方,帮助大家更好的理解和学习Java线程的相关资料,感兴趣的朋友可以了解下
    2020-09-09
  • Spring加载properties文件的两种方式实例详解

    Spring加载properties文件的两种方式实例详解

    这篇文章主要介绍了Spring加载properties文件的两种方式,需要的朋友可以参考下
    2018-02-02
  • 基础不牢,地动山摇,Java基础速来刷刷

    基础不牢,地动山摇,Java基础速来刷刷

    基础不牢,地动山摇,快来一起学习一下基础吧,不断地学习就算是基础也会有新的认知和收获,加油
    2021-08-08

最新评论