关于java 8:给定一个带有getOrDefault的键的hashmap值

Update a hashmap value, given a key with getOrDefault

我有一个HashMap

1
HashMap<string, Integer> hmap = new HashMap<>();

我想在哪里增加HashMap值。 为了避免nullPointer Exception,如果密钥不存在,我检查它! 假设数据是:

1
2
3
4
5
6
7
8
9
10
11
//201803271 - 1000
//201803271 - 1000
//201803272 - 1000

//inside a loop i read the data...
  if (hmap.get("201803271") != null) {
      hmap.put("201803271", hmap.get("201803271") + 1000);
  }else{
      hmap.put("201803271", 1000);
  }
//end of loop

这是有效的:

1
2
201803271 - 2000
201803272 - 1000

但是,我读了这个问题如何更新一个值,给定一个java hashmap中的键? 并且有一个使用Java 8方法getOrDefault的解决方案。 我尝试过这个

1
hmap.put("201803271", count.getOrDefault("201803271", 1000) + 1000)

但是,有了这个解决方案我得到错误的结果......

1
2
201803271 - 3000
201803272 - 2000

我错过了什么?


Java 8仅为此类问题将merge方法引入Map接口:

1
hmap.merge("201803271", 1000, Integer::sum);

这意味着"为此密钥设置1000,但如果此密钥已经有值,则为其添加1000"。

您的解决方案无法正常工作的原因是您默认获得1000,然后向其中添加1000。 要使用getOrDefault正确执行此操作,您需要在getOrDefault中将1000替换为0。hmap.put("201803271", count.getOrDefault("201803271", 0) + 1000))


你可以这样做:

1
map.put(key, map.getOrDefault(key, 0) + inc);

要么

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