报错代码
item.setResults(resultMap.getOrDefault(id, Lists.newArrayList()).stream()
.sorted((r1, r2) -> r1.getResultMode().equals(WorkResultModeEnum.COMPARE) ? -1 : 1)
.sorted((r1, r2) -> code2Index.get(r1.getName()) == null ? 1
: (code2Index.get(r2.getName()) == null ? -1 :
这是因为在 JDK7 版本以上,Comparator 要满足自反性,传递性,对称性,否则 Arrays.sort,Collections.sort都会报 IllegalArgumentException 异常。
自反性:当两个相同的元素相比时,compare必须返回0,也就compare(o1, o1) = 0;
反对称性:如果compare(o1,o2) = 1,则compare(o2, o1)必须返回符号相反的值也就是 -1;
传递性:如果 a>b, b>c, 则 a必然大于c。也就是compare(a,b)>0,compare(b,c)>0, 则compare(a,c)>0。
简单来说,就是需要考虑对象o1和对象o2为null的情况,即当o1与o2都为null时两者大小如何判定呢,当o1为null但o2不为null时两者大小又如何判定呢,同理当o2为null但o1不为null时两者大小又如何判定呢。
修改后代码:
code2Index.get(r1.getName()).compareTo(code2Index.get(r2.getName())))).collect(Collectors.toList()));
item.setResults(resultMap.getOrDefault(id, Lists.newArrayList()).stream()
.sorted((r1, r2) -> {
if (r1.getResultMode().equals(WorkResultModeEnum.COMPARE) && !r2.getResultMode().equals(WorkResultModeEnum.COMPARE)) {
return -1;
} else if (!r1.getResultMode().equals(WorkResultModeEnum.COMPARE) && r2.getResultMode().equals(WorkResultModeEnum.COMPARE)) {
return 1;
} else {
Integer r1Index = code2Index.get(r1.getName());
Integer r2Index = code2Index.get(r2.getName());
if (r1Index == null && r2Index == null) {
return 0;
} else if (r1Index == null) {
return 1;
} else if (r2Index == null) {
return -1;
} else {
return r1Index.compareTo(r2Index);
}
}
})
.collect(Collectors.toList()));