如何在java中增加Map中特定键的值?

时间:2014-11-15 11:13:14

标签: java map

在C ++中如果我声明一个类似的地图     std :: map m

然后我可以用这种方式递增地图中特定键的值

m[key]++

在Java中我声明了一个地图

Map<Integer, Integer> m = new HashMap<>();

我以这种方式递增特定键的值:

m.put(key, m.get(key).intValue() + 1)

我的问题:有没有捷径或更好的方法来做到这一点?

5 个答案:

答案 0 :(得分:16)

您可以使用compute(Java 8 +):

m.compute(key, (k, v) -> v + 1);

答案 1 :(得分:8)

我总是倾向于使用mutable int来解决这些问题。所以代码最终看起来像......

m.get(key).increment()

这避免了不必要的放置开销(这很小)。

答案 2 :(得分:6)

由于自动装箱,您不需要.intValue(),但除此之外,没有更好的方法可以做到这一点。

m.put(key, m.get(key) + 1)

原因(或问题)是Java决定不让类实现自己的运算符(就像在C ++中一样)。

答案 3 :(得分:3)

接受的答案存在一个问题,即如果请求的键没有任何值,我们将获得异常。以下是使用Java 8功能解决问题的几种方法:

  1. 使用Map.merge()

m.merge(key, 1, Integer::sum)

如果该键不存在,则将1作为值,否则将1等于该键给定的值。

  1. 使用Map.putIfAbsent()
m.putIfAbsent(key, 1);
m.put(key, m.get(key) + 1);

与其他答案类似,但明确指出您需要首先初始化该值。

  1. 使用Map.compute()

m.compute(key, (k, v) -> v == null ? 1 : v + 1)

始终计算该值,如果还没有,则提供1。

  1. 使用Map.getOrDefault()

m.put(key, m.getOrDefault(key, 0) + 1)

获取值(如果存在)或默认值,并返回该值加1。

答案 4 :(得分:2)

您可以放弃intValue来电并依赖自动取消装箱。