You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Apache Commons MultiKeyMap更新指定多键对应值的解决方案

问题根因

  1. replace方法报错:Apache Commons Collections4的MultiKeyMap没有提供多键参数重载的replace方法,该方法继承自原生Map接口,仅支持传入单个MultiKey对象作为键,所以直接传3个字符串参数会触发参数类型不匹配错误。
  2. 误以为put会新增条目:只要传入的多键组合(顺序、取值、数量)和已有条目完全一致,put方法会直接覆盖对应旧值,不会新增条目。你遇到的新增情况大概率是键的匹配条件不一致导致的。

可行解决方案

方案1:直接修改引用类型值(最高效,适合当前存储List的场景)

你存储的值是List<Double>引用类型,从map中get到的List对象和map内部存储的是同一个实例,直接修改List内的元素即可完成更新,不需要调用任何put/replace方法:

if (multiKeyMap.containsKey(source, base, product)) {
    List<Double> fees = multiKeyMap.get(source, base, product);
    // 直接修改list内的元素,map中的值会同步更新
    fees.set(0, fees.get(0) + 1);
    fees.set(1, fees.get(1) + 500);
    // 无需额外调用put/replace
}

方案2:用put方法覆盖旧值(适合值为不可变类型的通用场景)

如果你的存储值是不可变类型(比如String、Integer),直接用完全匹配的多键组合调用put方法即可完成更新,不会新增条目:

if (multiKeyMap.containsKey(source, base, product)) {
    List<Double> fees = multiKeyMap.get(source, base, product);
    Double count = fees.get(0) + 1;
    Double amount = fees.get(1) + 500;
    List<Double> list33 = new ArrayList<>();
    list33.add(count);
    list33.add(amount);
    // 多键完全匹配的情况下,put会直接覆盖旧值,不会新增
    multiKeyMap.put(source, base, product, list33);
}

执行操作后可以打印multiKeyMap.size()验证,map的大小始终为2,不会新增额外条目。


内容的提问来源于stack exchange,提问作者Masoom Raza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 05:09:03