1.背景
原数据查询是使用一个sql进行查询并使用order by 对多字段进行排序,现在需要分批次查询出数据全部放入list中在进行排序,需与数据库使用order by排序一致。
2.解决办法
在java 8之后,有了Comparator比较器,直接使用Comparator进行解决,如下:
public class UserInfo{ private Integer userId; private String username; private Date birthDate; private Integer age; private float fRate; private char ch; //此处get/set方法省略 }
sql排序为:
select * from user_info order by username asc ,birthDate asc ,age desc;
java排序为
//这里只列出排序的方法,假设查询出的list集合为userInfoList userInfoList.sort(Comparator.comparing(UserInfo::getAge).reserved().thenComparing(Comparator.comparing(UserInfo::getBirthDate)).thenComparing(Comparator.comparing(UserInfo::getUsername)));
说明: reserved() 表示倒序排列
若实体对象字段可能为空则Comparator.comparing(UserInfo::getAge)需修改为Comparator.comparing(UserInfo::getAgeo,Comparator.nullsLast(Date::compareTo))
其中: nullsLast()表示空值放到最后,与之对应的为nullsFirst(),空值放到最前面
Date表示UserInfo的age字段的数据类型
thenComparing(Comparator<? super T> other) //然后,再去比较.
Comparator其他方法:可自行百度如何使用。
compare()
equals()
reversed() //倒序
thenComparing(Comparator<? super T> other) //然后,再去比较.
thenComparing( Function<? super T, ? extends U> keyExtractor,
Comparator<? super U> keyComparator) //先通过第一个比较器,再执行第二个比较器...串联
thenComparing()
thenComparingInt()
thenComparingLong()
thenComparingDouble()
reverseOrder()
naturalOrder()
nullsFirst()
nullsLast()
comparing () //静态方法
comparing()
comparingInt()
comparingLong()
comparingDouble()