java stream 用 collectors.tomap() 收集记录时,如果键可能重复,要提供合并函数。以 sku 汇总为例,重复 sku 的数量相加,使用 linkedhashmap 保留首次出现的顺序。
准备重复 SKU 的记录
下面的代码使用 Java 17,保存为 Totals.java。
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Totals {
record Item(String sku, int quantity) {}
public static void main(String[] args) {
var items = List.of(new Item("A01", 2),
new Item("B02", 1),
new Item("A01", 3));
Map<String, Integer> totals = items.stream().collect(
Collectors.toMap(Item::sku, Item::quantity,
Integer::sum, LinkedHashMap::new)
);
System.out.println(totals);
}
}
前三个参数分别指定键、值和冲突合并规则,最后一个参数指定 Map 实现。这里假定累计数量在 int 范围内。
运行并核对数量及顺序
在文件所在目录运行。
立即学习“Java免费学习笔记(深入)”;
javac Totals.java java Totals
预期输出 {A01=5, B02=1}。同一个 SKU 的两条记录合成一条。
必须拒绝重复时省略合并规则
如果重复 SKU 代表数据错误,可用两参数重载。下例放在 main 方法中单独验证。
items.stream().collect(Collectors.toMap(Item::sku, Item::quantity));
示例数据会抛出 IllegalStateException。若业务要求保留最新记录,应按明确的时间或版本选择合并结果。


















