Java Collectors类如何收集流操作结果

Collectors类提供丰富静态方法将流元素收集到集合、Map或数值结果中,如toList()、toSet()、toMap()实现集合转换,groupingBy()和partitioningBy()支持分组与分区,counting()、summarizingInt()等用于聚合统计,joining()可拼接字符串,结合lambda提升代码可读性。

Java中的Collectors类是java.util.stream.Collectors的工具类,用于将流(Stream)中的元素收集到目标容器中,比如集合、字符串或数值结果。它提供了丰富的静态方法来支持常见的归约操作,是流式编程中不可或缺的一部分。

收集到集合类型

最常见的是把流中的元素收集为List、Set或Map。

例如:
  • toList():将元素收集到一个List中
  • toSet():收集到Set,自动去重
  • toCollection(集合构造器):指定具体集合类型,如TreeSet
示例代码:
List list = Stream.of("a", "b", "c").collect(Collectors.toList());
Set set = Stream.of(1, 2, 2, 3).collect(Collectors.toSet());

收集为Map结构

使用toMap可以将流中的对象转换为键值对形式的Map。

常用方法:
  • toMap(键映射函数, 值映射函数)
  • 当存在重复键时,需提供第三个参数(合并函数)避免冲突
示例:
Map map = list.stream()
    .collect(Collectors.toMap(
        Person::getId, 
        Person::getName,
        (existing, replacement) -> existing  // 冲突时保留旧值
    ));

分组与分区操作

Collectors支持按条件对数据进行分类。

  • groupingBy(Function):按某个属性分组,返回Map
  • groupingByConcurrent:并发版本,适合并行流
  • partitioningBy(Predicate):按布尔条件分成两组(true/false)
举例:
Map> byDept = people.stream()
    .collect(Collectors.groupingBy(Person::getDepartment));

Map> evenOdd = numbers.stream()
    .collect(Collectors.partitioningBy(n -> n % 2 == 0));

聚合与统计数值结果

可用于计算总和、平均值、计数等。

  • counting():计数
  • summingInt/Long/Double:求和
  • averagingInt/Long/Double:求平均
  • summarizingInt/Long/Double:返回统计对象(含count, sum, min, max, average)
示例:
long count = list.stream().collect(Collectors.counting());
double avgAge = users.stream().collect(Collectors.averagingDouble(User::getAge));
IntSummaryStatistics stats = numbers.stream().collect(Collectors.summarizingInt(x -> x));

连接字符串

对于字符串流,可以用joining拼接内容。

  • joining():无分隔符拼接
  • joining(", "):用逗号加空格连接
  • joining(", ", "[", "]"):带前缀和后缀
示例:
String joined = Stream.of("a", "b", "c")
    .collect(Collectors.joining(", ", "[", "]"));
// 输出: [a, b, c]
基本上就这些常见用法。Collectors让流的结果处理变得简洁高效,结合lambda表达式可大幅提升代码可读性。根据实际需求选择合适的收集方式即可。