Collectors类是Java Stream API中实现归约与聚合的核心工具,提供toList()、toSet()等集合收集方法,summarizingInt等数值统计方法,groupingBy()、partitioningBy()等分组分区方法,以及支持下游收集器的高级映射组合功能。

Java中的Collectors类是Stream API中实现归约(reduction)与聚合(aggregation)的核心工具,它提供大量静态工厂方法,用于将流中元素收集为各种目标结构,如List、Set、Map,或执行求和、平均、分组、分区等操作。
基础集合收集:toList()、toSet()、toCollection()
最常用的是把流转换为标准集合容器:
-
Collectors.toList():返回新创建的ArrayList,顺序与流一致; -
Collectors.toSet():返回无序、去重的HashSet(不保证插入顺序); -
Collectors.toCollection(Supplier:可指定具体集合类型,例如) toCollection(LinkedList::new)或toCollection(TreeSet::new)。
数值统计与汇总:summarizingInt/Long/Double、averagingXXX
适用于数字流,避免手动遍历计算:
-
Collectors.summarizingInt(Person::getAge)返回IntSummaryStatistics对象,含count、sum、min、max、average; -
Collectors.averagingDouble(Person::getSalary)直接返回double型平均值; -
Collectors.summingLong(Product::getStock)返回long总和,比先mapToInt再sum更简洁(尤其对包装类型安全)。
分组与分区:groupingBy()、partitioningBy()
按条件对元素分类,是业务逻辑中高频场景:
立即学习“Java免费学习笔记(深入)”;
-
groupingBy(Function按键分组,返回) Map,例如> groupingBy(Person::getGender); - 支持二级聚合:
groupingBy(Person::getCity, counting())统计各城市人数; -
partitioningBy(Predicate是特殊的二分组(true/false),返回) Map,例如> partitioningBy(p -> p.getAge() >= 18)。
高级映射与下游收集器组合
几乎所有groupingBy或partitioningBy都支持“下游收集器”参数,实现嵌套聚合:
-
groupingBy(Person::getDepartment, mapping(Person::getName, joining(", ")))→ 每个部门对应一个姓名拼接字符串; -
groupingBy(Person::getYear, reducing(0, Person::getSalary, Integer::sum))→ 按年份累加薪资; -
toMap(keyMapper, valueMapper, mergeFunction)构建自定义Map,需注意key重复时的合并策略(如(v1,v2) -> v1保留首个)。










