java 8 Collections 多字段排序

2019-12-23  本文已影响0人  dream新世界

以前的做法:

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());
上一篇 下一篇

猜你喜欢

热点阅读