大家应该都用过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就是降序反之就是升序
注意事项!!!
- 很多文章都说o1,和o2是集合里面的第一个对象和第二个对象,这个说法是不完全正确的,通过debug可以知道o1和o2是根据数值来正序排列的,如果是时间那么就是小时间在前 大时间在后
- 还有一个就是这里返回的数字大于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