首页 > 其他 > 详细

记工作中遇到的Date类相关的坑

时间:2020-07-09 17:11:54      阅读:61      评论:0      收藏:0      [点我收藏+]
  • Date的排序问题

        //根据审核时间排序,审核时间晚的后执行
        Collections.sort(executableList, (o1, o2) -> {

            if ( o1.getAuditDate().after(o2.getAuditDate())){
                return 1;
            }
if (o1.getAuditDate() ==( o2.getAuditDate())) { return 0; } return -1; });

这段代码被放在了xxljob的handler中,因此最初没有检查出错误,直到发现job执行不成功,

而把该段代码放在单元测试执行会报错:java.lang.IllegalArgumentException: Comparison method violates its general contract!

意思是比较方法不满足可逆性,但是按照代码逻辑应该是没有错的,因此肯定是比较的方法有问题

于是进行更改

//根据审核时间排序,审核时间晚的后执行
        Collections.sort(executableList, (o1, o2) -> {

            if ( o1.getAuditDate().getTime()>(o2.getAuditDate().getTime())){
                return 1;
            }
            if (o1.getAuditDate().getTime() ==( o2.getAuditDate()).getTime()) {
                return 0;
            }
            return -1;
        });

其实不用改这么多,直接把 == 换成.equal()即可(算是低级错误了,以后注意),而点开源码查看

 public boolean equals(Object obj) {
        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    }

可以看到也是使用getTime()获取时间戳进行比较的

其实上述写法都太过麻烦,经过查询,直接用java自带的比较器即可解决

//根据审核时间排序,审核时间晚的后执行
            executableList.sort( Comparator.comparing(PriceReadjustDO::getAuditDate));

 

记工作中遇到的Date类相关的坑

原文:https://www.cnblogs.com/CodeSpike/p/13274460.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!