【java8分页排序】lambda的(多字段)分页和排序 comparing,thenComparing的区别

java8的lambda表达式排序,理应用comparing,多字段 后面增加thenComparing,默认排序规则为正序。

排序

现在有个排序需求:
a-倒序
b-当a相同时,正序
c-当b相同时,倒序

正确的写法:

 List<UserCouponVo> newList = list.stream().sorted(Comparator
                    .comparing(UserCouponVo::getA,Comparator.reverseOrder())
                    .thenComparing(UserCouponVo::getB)
                    .thenComparing(UserCouponVo::getC,Comparator.reverseOrder())
            ).collect(Collectors.toList());

错误的写法:

 List<UserCouponVo> newList = list.stream().sorted(Comparator
                    .comparing(UserCouponVo::getA).reversed()
                    .thenComparing(UserCouponVo::getB)
                    .thenComparing(UserCouponVo::getC).reversed()
            ).collect(Collectors.toList());

原因
Comparator.comparing(类属性).reversed() 是得到正序结果后再逆序 , .reversed() 是逆反前面的所有排序
Comparator.comparing(类属性,Comparator.reverseOrder()); 当前字段直接逆序。

所以,当需求为:
a-倒序
b-当a相同时,倒序
c-当b相同时,倒序

可以写成:

 List<UserCouponVo> newList = list.stream().sorted(Comparator
                    .comparing(UserCouponVo::getA)
                    .thenComparing(UserCouponVo::getB)
                    .thenComparing(UserCouponVo::getC).reversed()
            ).collect(Collectors.toList());

所以,当需求为:
a-正序
b-当a相同时,正序
c-当b相同时,正序

可以写成:

 List<UserCouponVo> newList = list.stream().sorted(Comparator
                    .comparing(UserCouponVo::getA)
                    .thenComparing(UserCouponVo::getB).reversed()
                    .thenComparing(UserCouponVo::getC).reversed()
            ).collect(Collectors.toList());

或:

 List<UserCouponVo> newList = list.stream().sorted(Comparator
                    .comparing(UserCouponVo::getA)
                    .thenComparing(UserCouponVo::getB)
                    .thenComparing(UserCouponVo::getC)
            ).collect(Collectors.toList());

分页:

 List<UserCouponVo> newList = list.stream().sorted(Comparator
                    .comparing(UserCouponVo::getA)
                    .thenComparing(UserCouponVo::getB)
                    .thenComparing(UserCouponVo::getC)
            ).skip((bo.getPage() - 1) * bo.getPageSize()).limit(bo.getPageSize())
            .collect(Collectors.toList());

有种mysql的既视感。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值