JAVA8 Stream之Sort排序comparing 和thenComparing
阿新 • • 發佈:2018-10-31
今天在使用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()的....
所以.靜下心來,你會理解其中的奧祕,從左往右進行運算的