Collectors.mapping用于先转换元素再用下游收集器处理,签名是Collectors.mapping(Function, Collector),必须配合下游收集器使用,常见组合包括toList、toSet、summingInt及groupingBy等。

Collectors.mapping 本身不直接“组合”多个收集器,而是把一个映射函数和另一个下游收集器(downstream collector)绑定起来,用于在收集前对流中每个元素做一次转换。它的作用是:先变换元素,再用下游收集器处理变换后的结果。
核心用法:mapping(映射函数, 下游收集器)
签名是:Collectors.mapping(Function
- 第一个参数:对每个原始元素做转换(比如从
Person取name字段) - 第二个参数:对转换后的值进行收集(比如收集为
List、Set、求和、分组等)
常见组合示例
✅ 收集名字列表:
List<String> names = people.stream()
.collect(Collectors.mapping(Person::getName, Collectors.toList()));
✅ 去重收集年龄集合:
立即学习“Java免费学习笔记(深入)”;
Set<Integer> uniqueAges = people.stream()
.collect(Collectors.mapping(Person::getAge, Collectors.toSet()));
✅ 统计所有名字的总长度(先映射为长度,再求和):
Integer totalNameLength = people.stream()
.collect(Collectors.mapping(p -> p.getName().length(), Collectors.summingInt(Integer::intValue)));
✅ 分组后对每组名字做收集(嵌套 mapping):
Map<String, List<String>> cityToNames = people.stream()
.collect(Collectors.groupingBy(
Person::getCity,
Collectors.mapping(Person::getName, Collectors.toList())
));
能嵌套使用的下游收集器类型
几乎所有标准收集器都可作为 downstream,包括:
-
Collectors.toList()/toSet()/toCollection(HashSet::new) -
Collectors.summingInt/averagingDouble/counting -
Collectors.joining(", ")(注意:要求映射后是 String) -
Collectors.groupingBy或partitioningBy(实现多级处理)
注意事项
- 如果映射函数返回
null,而下游收集器不支持 null(如toList()允许,但toSet()在某些实现中可能出问题),需提前判空或用Objects.toString(x, "")防御 - 不能直接写
Collectors.mapping(...).andThen(...)—— mapping 没有 andThen 方法;组合靠“下游参数”实现,不是链式调用 - 想做多次转换?通常应先用
map()流操作,再 collect;mapping 适合“收集时临时转换”,语义更聚焦于归约阶段


















