在 Java 里 Comparator 出错通常并不是语法写错,而是语义或契约(contract)被破坏。下面按最常见原因给你梳理,并给出示例和解决办法。
List<Integer> list = Arrays.asList(3, 1, 2);
list.sort((a, b) -> a > b ? 1 : -1);
表面看没问题,但如果 a == b 时返回 -1,就违反了契约。
(a, b) -> Integer.compare(a, b);
或使用:
Comparator.naturalOrder()
list.sort(Comparator.comparing(Student::getName));
如果 getName() 返回 null,直接 NPE。
Comparator.comparing(Student::getName, Comparator.nullsFirst(String::compareTo))
或:
Comparator.nullsLast(Comparator.naturalOrder())
Comparator 必须满足:
compare(a,b) == -compare(b,a)a < b 且 b < c,则 a < c(a, b) -> a.equals(b) ? 0 : Math.random() > 0.5 ? 1 : -1;
这会导致 Arrays.sort / Collections.sort 结果错乱甚至崩溃。
Comparator<String> c = (a, b) -> a.length() - b.length();
看似 OK,但若差值溢出(极端长度)会出错。
Comparator.comparingInt(String::length)
Comparator<Object> c = (a, b) -> ((Integer)a).compareTo((Integer)b);
一旦放入非 Integer,直接 ClassCastException。
Comparator.comparing 是 Java 8+如果你不确定哪里错:
list.sort((a, b) -> {
int r = ...;
if ((r > 0 && a <= b) || (r < 0 && a >= b))
throw new IllegalStateException("bad comparator");
return r;
});
Java Comparator 出错,90% 是因为:null、逻辑不对称、违反契约、或类型不匹配。
如果你愿意,可以把具体报错信息或代码贴出来,我可以直接帮你定位是哪一类问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。