熟能生巧 之 lamda+自定义Comparator比较 中文字符串比较

适用场景

数据库使用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的效果
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值