按部门收集用户时抛 IllegalStateException: Duplicate key,同一部门有两个人就整批失败,接口直接返回 500。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
Collectors.toMap(User::getDept, u -> u, (a, b) -> a) Collectors.groupingBy(User::getDept)
toMap 底层用 HashMap 的 merge,遇到相同 key 没给合并规则,默认当成非法状态抛出。这一点先确认清楚,后面就不用反复试。
「toMap 重复键」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。
改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
具体做法是,第三个参数写 (a, b) -> a 保留先出现的;或改用 groupingBy 收成列表;先确认重复 key 是不是脏数据。
改完照着核一遍,同样数据跑完不再抛异常,部门人数与库表统计一致。
