今天在使用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()的....
所以.靜下心來,你會理解其中的奧秘,從左往右進行運算的