1. 程式人生 > >JAVA8 Stream之Sort排序comparing 和thenComparing

JAVA8 Stream之Sort排序comparing 和thenComparing

今天在使用Stream排序的時候,出現了一個bug,簡單的記錄下,方便下次查詢

 

首先根據降序的sort方法,對list集合中的物件的某個屬性進行排序.float getFollowDegree()的返回值時,所以查詢出來後進行排序的順序是降序(DESC,從大到小)的,如果沒有reversed()方法的話,就是升序排列(ASC,從小到大).這樣是沒有問題的...

        //對listResult進行排序,根據伴隨度進行降序F
        List<FollowIMSI> collect = listResult.stream()
            .sorted(Comparator.comparing(FollowIMSI::getFollowDegree).reversed())
            .collect(Collectors.toList());

 

下面問題出現了.如果我想先對followDegree降序,如果followDegree相等,再根據codeDaysThirsty的值進行降序排列,很自然的就往後加了....

       //根據伴隨度和30天出現比率進行排序
        List<FollowIMSI> collect1 = list1.stream()
            .sorted(Comparator.comparing(FollowIMSI::getFollowDegree).reversed()
            .thenComparing(FollowIMSI::getCodeDaysThirsty).reversed())
            .collect(Collectors.toList());

 

很多時候,並沒有那麼多想當然的,從上述程式碼中可以看到,先對followDegree進行降序排列,再對codeDaysThirty進行降序排列,沒有問題....

其實,不然

 

我們需要的是對followDegree的值降序,如果值相等,再對codeDaysThirty進行降序.所以說,上述程式碼的理解應該為:

以codeDaysThirty進行降序排列,如果codeDaysThirty相等,再以followDegree進行排序.

 

所以爭取的程式碼應該是:

       //根據伴隨度和30天出現比率進行排序
        List<FollowIMSI> collect1 = list1.stream()
            .sorted(Comparator.comparing(FollowIMSI::getFollowDegree)
            .thenComparing(FollowIMSI::getCodeDaysThirsty).reversed())
            .collect(Collectors.toList());

注意在getFollowDegree()後是沒有reversed()的....

所以.靜下心來,你會理解其中的奧祕,從左往右進行運算的