在 Java 里 Comparator 本身不是用来“分组”的,但可以配合分组操作一起使用。常见做法有下面几种,按使用频率从高到低给你讲清楚。
Comparator + Map 分组(强烈推荐)class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
}
Collectors.groupingByList<Person> list = List.of(
new Person("A", 20),
new Person("B", 20),
new Person("C", 30)
);
Map<Integer, List<Person>> groupByAge =
list.stream()
.collect(Collectors.groupingBy(Person::getAge));
✅ 结果:
20 -> [A, B]
30 -> [C]
Map<Integer, List<Person>> result =
list.stream()
.collect(Collectors.groupingBy(
Person::getAge,
Collectors.collectingAndThen(
Collectors.toList(),
l -> {
l.sort(Comparator.comparing(Person::getName));
return l;
}
)
));
Map<String, List<Person>> group =
list.stream()
.collect(Collectors.groupingBy(p -> {
if (p.getAge() < 25) return "青年";
else return "中年";
}));
✅ 结果:
青年 -> [A, B]
中年 -> [C]
⚠️ Comparator 只能排序,不能直接分组
list.sort(Comparator.comparing(Person::getAge));
这只是:
[20, 20, 30]
不是分组,只是顺序变了。
TreeMap<Integer, List<Person>> map =
list.stream()
.collect(Collectors.groupingBy(
Person::getAge,
TreeMap::new,
Collectors.toList()
));
| 目的 | 是否用 Comparator | 推荐方式 |
|---|---|---|
| 分组 | ❌ | Collectors.groupingBy |
| 分组 + 排序 | ✅ | groupingBy + Comparator |
| 排序 | ✅ | Comparator |
| 有序分组 | ✅ | TreeMap + groupingBy |
Comparator 负责“怎么比”,groupingBy 负责“怎么分”
两者通常 配合使用,而不是替代关系
如果你有具体场景(比如:按多个字段分组?按对象某个规则分组?),可以直接贴代码,我帮你写完整示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。