collectors.tomap 统计业务变量权重需指定key、value映射及mergefunction实现聚合,如累加用(w1,w2)->w1+w2,取最大值用math.max等,且必须处理null key避免异常。

使用 Collectors.toMap 统计业务变量权重,核心在于将原始数据流按业务变量分组,并在映射过程中聚合其权重(如求和、取最大值等)。它本身不直接支持聚合,需配合 mergeFunction 参数实现“重复 key 时的合并逻辑”,从而完成权重统计。
明确业务变量与权重字段
确保待处理的集合元素中,存在可作为 map key 的业务变量(如 String type、Long productId),以及可累加/比较的权重字段(如 Double weight、Integer score)。例如:
new Item("order", 0.6),
new Item("user", 0.3),
new Item("order", 0.4)
);
用 toMap 实现权重累加(最常见场景)
当同一业务变量出现多次,需把权重相加时,关键在第三个参数 mergeFunction:
- 第一个参数:key mapper,提取业务变量(如
Item::getType) - 第二个参数:value mapper,提取原始权重(如
Item::getWeight) - 第三个参数:合并函数,定义重复 key 时如何处理(如
(w1, w2) -> w1 + w2)
示例代码:
Map.collect(Collectors.toMap(
Item::getType,
Item::getWeight,
(w1, w2) -> w1 + w2
));
结果:{"order"=1.0, "user"=0.3}
其他常用权重聚合方式
根据业务需要,替换 mergeFunction 即可:
-
取最大权重:
(w1, w2) -> Math.max(w1, w2) -
取最小权重:
(w1, w2) -> Math.min(w1, w2) -
计数(视为权重为 1):
(c1, c2) -> c1 + 1,配合item -> 1作 value mapper -
加权平均(需额外状态):此时
toMap不够用,建议改用Collectors.groupingBy配合Collectors.averagingDouble
注意空值与重复 key 异常
toMap 默认遇到重复 key 会抛 IllegalStateException,所以必须提供 mergeFunction。若原始数据中业务变量可能为 null,需提前过滤或映射为默认值,否则会触发 NullPointerException:
- 过滤 null key:
.filter(item -> item.getType() != null) - 转默认值:
item -> item.getType() != null ? item.getType() : "unknown"










