在C ++中如果我声明一个类似的地图 std :: map m
然后我可以用这种方式递增地图中特定键的值
m[key]++
在Java中我声明了一个地图
Map<Integer, Integer> m = new HashMap<>();
我以这种方式递增特定键的值:
m.put(key, m.get(key).intValue() + 1)
我的问题:有没有捷径或更好的方法来做到这一点?
答案 0 :(得分:16)
您可以使用compute(Java 8 +):
m.compute(key, (k, v) -> v + 1);
答案 1 :(得分:8)
答案 2 :(得分:6)
由于自动装箱,您不需要.intValue()
,但除此之外,没有更好的方法可以做到这一点。
m.put(key, m.get(key) + 1)
原因(或问题)是Java决定不让类实现自己的运算符(就像在C ++中一样)。
答案 3 :(得分:3)
接受的答案存在一个问题,即如果请求的键没有任何值,我们将获得异常。以下是使用Java 8功能解决问题的几种方法:
Map.merge()
m.merge(key, 1, Integer::sum)
如果该键不存在,则将1作为值,否则将1等于该键给定的值。
Map.putIfAbsent()
m.putIfAbsent(key, 1);
m.put(key, m.get(key) + 1);
与其他答案类似,但明确指出您需要首先初始化该值。
Map.compute()
m.compute(key, (k, v) -> v == null ? 1 : v + 1)
始终计算该值,如果还没有,则提供1。
Map.getOrDefault()
m.put(key, m.getOrDefault(key, 0) + 1)
获取值(如果存在)或默认值,并返回该值加1。
答案 4 :(得分:2)
您可以放弃intValue
来电并依赖自动取消装箱。