1. 程式人生 > 其它 >Java排序(一)

Java排序(一)

一、【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的既視感。