WMX · 随记
·Java· 3 分钟阅读

toMap 遇到重复键:冲突策略要说清楚

把用户列表转成 Map 时,同一个业务 ID 出现两次,收集过程可能抛异常。重复数据究竟应该覆盖、合并还是拒绝,需要显式决定。

▶ 本文含视频讲解
▶ 教学视频手动播放 · 英语讲解

Java Full Course

Java 基础课程作为语言背景复习;本文的特定 API、版本行为和边界条件以正文及文档为准。此为外部原版课程,多篇笔记可能共用;未剪辑为本文专属视频。

播放器需要能访问 YouTube 的网络;若这里无法加载,可打开原视频。本文与本地图解仍可独立阅读。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

把用户列表转成 Map 时,同一个业务 ID 出现两次,收集过程可能抛异常。重复数据究竟应该覆盖、合并还是拒绝,需要显式决定。

理解核心机制

Collectors.toMap 的常见两参数版本不接受重复键。提供合并函数可以表达冲突策略,但“保留后者”只有在输入顺序有意义时才是可靠规则。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java11 行 · 可横向滚动
import java.util.List;
import java.util.stream.Collectors;
public class Demo {
    record Item(String key, int amount) {}
    public static void main(String[] args) {
        var items = List.of(new Item("a", 2), new Item("a", 3));
        var totals = items.stream().collect(Collectors.toMap(
            Item::key, Item::amount, Integer::sum));
        System.out.println(totals);
    }
}

适用边界与常见误区

合并函数需要考虑空值、溢出和并行规约的性质。若重复键本身代表数据错误,应该保留失败而不是悄悄覆盖。

继续练习

把合并函数分别改为保留最早、保留最新和求和,说明每一种策略对应的业务前提。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档