Java排序(一)
阿新 • • 發佈:2021-08-30
一、【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的既視感。