Java中Apache Commons MultiKeyMap更新指定多键对应值的解决方案
问题根因
replace方法报错:Apache Commons Collections4的MultiKeyMap没有提供多键参数重载的replace方法,该方法继承自原生Map接口,仅支持传入单个MultiKey对象作为键,所以直接传3个字符串参数会触发参数类型不匹配错误。- 误以为
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
相关产品推荐
相关产品推荐

