美文网首页
java 8 Collections 多字段排序

java 8 Collections 多字段排序

作者: dream新世界 | 来源:发表于2019-12-23 09:52 被阅读0次

以前的做法:

Collections.sort(list, (o1, o2) -> {
    if(o1.getFlexAgentId().equals(template.getFlexAgentId())
            && !o2.getFlexAgentId().equals(template.getFlexAgentId())){
        return 1;
    }else if(WeiBoGuideConstant.isWeiboChannel(Long.valueOf(template.getFlexAgentId()))
            && o1.getFlexAgentId().equals(WeiBoGuideConstant.WEIBO_ALL_CHANNEL.toString())
            && !o2.getFlexAgentId().equals(WeiBoGuideConstant.WEIBO_ALL_CHANNEL.toString())){
        return 1;
    }else if(o1.getFlexAgentId().equals("0")
            && !o2.getFlexAgentId().equals("0")){
        return 1;
    }else {
        return -1;
    }
});
Collections.sort(invalidAdList, Comparator.comparing(BillUrlResponse::getHdStartTime).reversed());

多级排序(java 8)

list.stream().sorted(Comparator.comparing(类::属性一).reversed().thenComparing(类::属性二).reversed());//先以属性一升序,升序结果进行属性一降序,再进行属性二升序,结果进行属性一降序属性二降序
 
list.stream().sorted(Comparator.comparing(类::属性一).thenComparing(类::属性二,Comparator.reverseOrder()));//先以属性一升序,再进行属性二降序

通过以上例子我们可以发现

  1. Comparator.comparing(类::属性一).reversed();

  2. Comparator.comparing(类::属性一,Comparator.reverseOrder());

两种排序是完全不一样的,一定要区分开来

1 是得到排序结果后再排序

2是直接进行排序,很多人会混淆导致理解出错,2更好理解,建议使用

例子:

List<MyUserCouponVo> couponList = couponList.stream().sorted(Comparator.comparing(MyUserCouponVo::getStatus)
                    .thenComparing(c-> c.getExpiredStartTime().compareTo(new Date()))
                    .thenComparing(MyUserCouponVo::getExpiredEndTime)).collect(Collectors.toList());

相关文章

网友评论

      本文标题:java 8 Collections 多字段排序

      本文链接:https://www.haomeiwen.com/subject/xcfznctx.html