java的比较器Comparator时间排序

大家应该都用过list的比较器,但是这里有个特别坑的地方需要注意一下

@Data
public class User {
// 先创建一个user对象里面有一个Date的类型
    private int id;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
}

// 加入10条时间每个都相差一秒存入list
List<User> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.setId(i);
            user.setCreateTime(new Date());
            Thread.currentThread().sleep(1000);
            list.add(user);
        }

// 使用比较器进行时间倒序
list.sort((o1, o2) -> {
	if(o2.getCreateTime().getTime() 
			- o1.getCreateTime().getTime() > 0){
            return 1;
		}else{
            return -1;
	}
});
  • 上述代码是用来控制如果o2的时间大于o1就是降序反之就是升序

注意事项!!!

  1. 很多文章都说o1,和o2是集合里面的第一个对象和第二个对象,这个说法是不完全正确的,通过debug可以知道o1和o2是根据数值来正序排列的,如果是时间那么就是小时间在前 大时间在后
  2. 还有一个就是这里返回的数字大于0小于0(等于就不说了),分别是正序和倒序但是要清楚的是这里的正序和倒序是依据当前list而言的举个例子
    [1,2,3,4,5,6] 假设这是一个需要排序的集合那么sort排序里面的list.sort((o1,o2)->{})就是当前o1:1 o2:2 继续分析,根据代码如果o1CompareTo(o2) 可以理解成a是否小于b如果是就返回-1
    源码的意思就是 o1 - 02 = -1 就是 o1 小于o2 按照当前顺序排列,反之o1 - o2 = 1 就是o1大于o2那么就是当前顺序倒叙排列.

切记:使用Comparator.comparing的时候里面的集合是默认按照ascll码值升序排列,所以这里o1-o2默认值应该是小于0这也就应对了小于0升序,大于0降序 并且要想大于0必须o2-o1


版权声明:本文为weixin_47733858原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。