java如何给集合分组
使用 Collectors.groupingBy() 方法
Java 8 及以上版本可以通过 Stream 和 Collectors.groupingBy() 对集合进行分组。该方法根据指定的分类函数将元素分组到 Map 中。
List<String> list = Arrays.asList("apple", "banana", "cherry", "apple");
Map<String, List<String>> grouped = list.stream()
.collect(Collectors.groupingBy(Function.identity()));
// 结果: {apple=[apple, apple], banana=[banana], cherry=[cherry]}
按自定义条件分组
可以通过 groupingBy 的第二个参数指定下游收集器,例如计算每组的数量或进一步处理:

Map<String, Long> countByGroup = list.stream()
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// 结果: {apple=2, banana=1, cherry=1}
多级分组
使用嵌套的 groupingBy 实现多级分组:
List<Person> people = Arrays.asList(
new Person("Alice", "London"),
new Person("Bob", "New York"),
new Person("Charlie", "London")
);
Map<String, Map<String, List<Person>>> multiGrouped = people.stream()
.collect(Collectors.groupingBy(Person::getCity,
Collectors.groupingBy(Person::getName)));
// 结果: {London={Alice=[...], Charlie=[...]}, New York={Bob=[...]}}
使用 Apache Commons Collections
如果项目使用 Apache Commons Collections,可以通过 CollectionUtils.groupBy() 实现分组:

List<String> list = Arrays.asList("apple", "banana", "cherry", "apple");
Map<String, List<String>> grouped = (Map<String, List<String>>) CollectionUtils.groupBy(list,
item -> item);
// 结果与 groupingBy 类似
手动遍历分组
对于低版本 Java 或需要更灵活控制的场景,可以手动遍历集合并填充 Map:
Map<String, List<String>> manualGrouped = new HashMap<>();
for (String item : list) {
manualGrouped.computeIfAbsent(item, k -> new ArrayList<>()).add(item);
}
// 结果: {apple=[apple, apple], banana=[banana], cherry=[cherry]}
分组后排序
分组后可以对 Map 的键或值进行排序:
Map<String, List<String>> sortedByKey = new TreeMap<>(grouped);
// 按键自然排序
以上方法适用于 List、Set 等集合类型,根据需求选择合适的方式。






