在 Java 中,Comparator 的“嵌套”通常是指:
先按一个字段比较,如果相等,再按另一个字段比较,也就是多级排序(链式比较)。
下面从常见写法到进阶用法给你梳理一下。
Comparator.thenComparing(Java 8+)这是最清晰、最常用的方式。
List<Person> list = ...;
Comparator<Person> comparator =
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName);
list.sort(comparator);
✅ 支持无限嵌套:
Comparator.comparing(Person::getAge)
.thenComparing(Person::getName)
.thenComparing(Person::getId);
Comparator<Person> comparator =
Comparator.comparing(Person::getAge)
.thenComparing(
Comparator.comparing(Person::getName).reversed()
);
或者:
Comparator.comparing(Person::getAge).reversed()
.thenComparing(Person::getName);
⚠️ 注意:
reversed() 只作用于当前 comparatorthenComparingInt / thenComparingLong避免装箱,性能更好:
Comparator<Person> comparator =
Comparator.comparingInt(Person::getAge)
.thenComparingLong(Person::getId);
Comparator<Person> comparator = (a, b) -> {
int cmp = Integer.compare(a.getAge(), b.getAge());
if (cmp != 0) return cmp;
return a.getName().compareTo(b.getName());
};
✅ 灵活
❌ 可读性差、易出错
Comparator.comparing(p -> p.getAddress().getCity())
.thenComparing(Person::getName);
List<Comparator<Person>> comparators = new ArrayList<>();
comparators.add(Comparator.comparing(Person::getAge));
comparators.add(Comparator.comparing(Person::getName));
Comparator<Person> finalComparator = comparators.stream()
.reduce(Comparator::thenComparing)
.orElse(null);
Comparator 嵌套 =
comparing().thenComparing().thenComparing()
如果你有:
可以贴代码,我可以直接帮你写嵌套 Comparator。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。