适用场景
数据库使用mysql的in查询自定义属性,入参可能会超出2000条主键,默认限制情况下,超出部分可能需要舍弃,但业务不允许,查出来主键之后就是需要做一次自定义字段的排序,故自己先将主键按2000条依次截取,然后汇总查询结果,做了排序,总结了中文排序的实现
public class TestObject{
private Integer id;
private String name;
}
List<TestObject> list1=list1.stream().sorted(
Comparator.comparing(TestObject::getId,
Comparator.nullsFirst(Integer::compareTo).reversed()))
.collect(Collection.toList());
/*上面用到了排序,首先按照TestObject的id字段排序,如果空,就使用nullsFirst来把null放在最前面,同事nullsFirst的入参是id属性的类型
reversed方法指定了排序规则,不指定就是正序,注意:正序和倒序如果想让空值的位置发生对应翻转,就需要使用相同的方法,如下:*/
st1=list1.stream().sorted(
Comparator.comparing(TestObject::getId,
Comparator.nullsFirst(Integer::compareTo)()))
.collect(Collection.toList());
//会保证正序的时候null在最前,倒序的时候null在最底部,null值所在的相对位置一致
在这里插入代码片
list1=list1.stream().sorted((obj1,obj2)->{
if(obj1.getName() == null && obj2.getName() == null){
return 0;
} else if(obj1.getName() == null ){
return -1;
} else if( obj2.getName() == null){
return 1;
}
return Collator.getInstance(Locale.CHINESE).compare(obj1.getName(),o2.getName())))
}).collect(Collection.toList());
//倒序 前置的3个带null判断的返回值以及非空的正常值比较的返回值全部跟正序相反~~~ 才能保证倒序的时候null在最后展示
list1=list1.stream().sorted((obj1,obj2)->{
if(obj1.getName() == null && obj2.getName() == null){
return 0;
} else if(obj1.getName() == null ){
return 1;
} else if( obj2.getName() == null){
return -1;
}
//注意这里返回的是负值,所以是倒序
return -Collator.getInstance(Locale.CHINESE).compare(obj1.getName(),o2.getName())))
}).collect(Collection.toList());
//如果不判空 会有null异常的 效果类似于上面的nullsFirst的效果