java8 stream排序以及自定义比较器方式

 更新时间:2023年03月23日 09:38:43   作者:zhang19age_  
这篇文章主要介绍了java8 stream排序以及自定义比较器方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java8 stream排序及自定义比较器

使用java 8 stream 排序 LIst 以及自定义对象比较器

主要比较的是时间,但是时间为最近时间,java中compareto方法比较的ACSII码所以2020和2021肯定是0在前面,但是我们需要的是最近的日期在前面,所以我们对返回的结果做出来取反,正常情况 对象1的edittime和对象2的time比较的是 如果对象1的time小于对象2的time就会返回 1 ,所有我们会发现2020在前面,我们只需要取反,因为 compareto 的结果只有三种 一种是1 升序,-1降序, 0是相等的意思( String类实现了Comparable接口。

CompareTo方法相等返回0,升序返回1,降序返回-1),这里可以理解为什么取反吗?

因为取反之后2021-09-06的就可以在前面啦。就可以按照最近时间的顺序进行排序啦。

如果有的java 8 stream 不懂的可以去看看哦

List<Map<String,Object>> resultList = null;

        Map<String,Object> ss1 = new HashMap<>();
        ss1.put("dictcode","2");
        ss1.put("DictValue","霓虹灯广告1");
        ss1.put("EditTime","2021-09-16 17:47:30");
        Map<String,Object> ss2 = new HashMap<>();
        ss2.put("dictcode","1");
        ss2.put("DictValue","霓虹灯广告2");
        ss2.put("EditTime","2020-04-16 17:47:30");
        Map<String,Object> ss3 = new HashMap<>();
        ss3.put("dictcode","21");
        ss3.put("DictValue","霓虹灯广告3");
        ss3.put("EditTime","2020-09-13 17:47:30");
        Map<String,Object> ss4 = new HashMap<>();
        ss4.put("dictcode","3");
        ss4.put("DictValue","霓虹灯广告4");
        ss4.put("EditTime","2020-09-16 17:47:30");
        Map<String,Object> ss5 = new HashMap<>();
        ss5.put("dictcode","4");
        ss5.put("DictValue","霓虹灯广告5");
        ss5.put("EditTime","2020-09-16 17:47:30");

        List<Map<String, Object>> maps = Arrays.asList(ss1, ss2, ss3, ss5, ss4);

        //默认按edittime排序,如果时间相同或者为空,则按照code排序
        maps.stream().sorted((o1, o2) -> {
            if (StringUtils.isEmpty(o1.get("EditTime").toString()) || StringUtils.isEmpty(o2.get("EditTime").toString())) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else if (o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            } else
                if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) > 0)
                    return -1;
                 else return 1;
            /*if (StringUtils.isEmpty(o1.get("EditTime").toString())||StringUtils.isEmpty(o2.get("EditTime").toString())
            || o1.get("EditTime").equals(o2.get("EditTime"))) {
                return o1.get("dictcode").toString().compareTo(o2.get("dictcode").toString());
            }
            else {
               if (o1.get("EditTime").toString().compareTo(o2.get("EditTime").toString()) >0)
                   return -1;
               return 1;
            }*/
        }).collect(Collectors.toList()).forEach(System.out::println);

java stream排序问题

我们在处理数据的时候经常会需要进行排序后再返回给前端调用,比如按照时间升序排序,前端展示数据就是按时间先后进行排序。

这里可以运用stream的sorted()方法来进行自定义的排序

说下用法

这里举例数据是一个list集合,List<Data>list,Data实体类中有许多属性,其中有时间字段,month 月份,那我们用stream().sorted()方法排序时,因为元素是类引用类型,需要自定义一个比较器Comparator,按month月份进行升序排序。

代码如下:

list.stream().sorted(Comparator.comparing(o->new Integer(o.getMonth()))).collect(Collectors.toList());

注意:

这里比较器里面参数用了Lambda 表达式,new Integer(o.getMonth()) ,这种封装成Integer类型的是因为我们设计的Data实体类中的month属性是String类型,并非Integer,转换成Integer是为了后续做月份遍历判断,如果属性是Integer Month,则可以比较器中可以直接定义类的方法引用

如下:

list.stream().sorted(Comparator.comparing(Data::getMonth).collect(Collectors.toList());

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java+Okhttp3调用接口的实例

    java+Okhttp3调用接口的实例

    这篇文章主要介绍了java+Okhttp3调用接口的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 简单谈谈Spring Ioc原理解析

    简单谈谈Spring Ioc原理解析

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解。
    2018-09-09
  • SpringBoot实现多文件上传的详细示例代码

    SpringBoot实现多文件上传的详细示例代码

    文件上传中并没有什么太多的知识点,下面这篇文章主要给大家介绍了关于SpringBoot实现多文件上传的详细示例,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 解决调试JDK源码时,不能查看变量的值问题

    解决调试JDK源码时,不能查看变量的值问题

    下面小编就为大家带来一篇解决调试JDK源码时,不能查看变量的值问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 基于Java实现一个复杂关系表达式过滤器

    基于Java实现一个复杂关系表达式过滤器

    这篇文章主要为大家详细介绍了如何基于Java实现一个复杂关系表达式过滤器。文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-07-07
  • 将idea中xml文件背景颜色去除的图文教程

    将idea中xml文件背景颜色去除的图文教程

    这篇文章主要介绍了将idea中xml文件背景颜色去除,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • idea鼠标控制放大缩小的操作

    idea鼠标控制放大缩小的操作

    这篇文章主要介绍了idea鼠标控制放大缩小的操作教程,具有很好的参考价值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java中判断集合是否相等的几种方法详解

    Java中判断集合是否相等的几种方法详解

    这篇文章主要介绍了Java中判断集合是否相等的几种方法详解,在平时的开发中,可能会遇到需要判断两个集合是否相等的需求,那么本文就来详细讲解一下几种实现方法,需要的朋友可以参考下
    2023-08-08
  • spring Bean创建的完整过程记录

    spring Bean创建的完整过程记录

    这篇文章主要给大家介绍了关于Spring中Bean实例创建的相关资料,文中通过实例代码和图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • SpringMVC拦截器和异常处理器使用示例超详细讲解

    SpringMVC拦截器和异常处理器使用示例超详细讲解

    拦截器(Interceptor)是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行。本文将详细讲讲SpringMVC中拦截器参数及拦截器链配置,感兴趣的可以尝试一下
    2022-09-09

最新评论