Java中的Collectors类有哪些常用功能_Collectors聚合操作解析

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()

按条件对元素分类,是业务逻辑中高频场景:

  • groupingBy(Function) 按键分组,返回Map>,例如groupingBy(Person::getGender)
  • 支持二级聚合:groupingBy(Person::getCity, counting()) 统计各城市人数;
  • partitioningBy(Predicate) 是特殊的二分组(true/false),返回Map>,例如partitioningBy(p -> p.getAge() >= 18)

高级映射与下游收集器组合

几乎所有groupingBypartitioningBy都支持“下游收集器”参数,实现嵌套聚合:

  • 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保留首个)。