3

我有下面的地图,我想将费率与费用地图中的每个值分开,而不需要迭代每个条目并构建新地图。这可能吗?

final String rate="2";
Map<String,BigDecimal> charges=new HashMap<String,BigDecimal>();
charges.put("tax", new BigDecimal(22));
charges.put("vat", new BigDecimal(200));
charges.put("gross", new BigDecimal(100));
charges.put("principal", new BigDecimal(150));

分工后

charges.put("tax", new BigDecimal(11));
charges.put("vat", new BigDecimal(100));
charges.put("gross", new BigDecimal(50));
charges.put("principal", new BigDecimal(75));
4

2 回答 2

7

是否可以?

不。此外,您是否应该首先为此使用地图并不明确。Charge使用具有适当字段的类型几乎肯定会更好。(这可能是 4 个字段,或者您可以从其他字段计算一些值。)

然后,您可以添加一个方法来将所有相关字段值除以一个常数,或者(更好的 IMO)返回具有新值的类型的实例(使Charge类型本身不可变)。

于 2013-08-22T14:41:38.913 回答
3

BigDecimal是不可变的,因此您必须用新实例替换地图中的值。但是,您不需要构建新地图(但您确实需要迭代):

final BigDecimal divisor = new BigDecimal(rate);

for (Entry<?, BigDecimal> e : charges.entrySet()) {
    e.setValue(e.getValue().divide(divisor));
}

虽然我怀疑@JonSkeet 关于使用地图是正确的;包含与地图键对应的字段的类在这里似乎更合适。

于 2013-08-22T14:44:56.370 回答