java8的thenComparing如何reversed()倒序


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

 

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

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

 

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

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

 

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

其實,不然

 

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

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

 

所以正確的代碼應該是:

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM