在填充HashMap时绕过空检查

rah*_*ahs 16 java hashmap

插入哈希映射时,是否总是要检查是否存在与要插入的密钥对应的空值?

例如,如果我想跟踪字符出现在单词中的次数,使用hashmap,我是否总是这样做:

if(hashMap.containsKey(ch)){
    hashMap.replace(ch, 1+hashMap.get(ch));    
}
else{
    hashMap.put(ch, 1);    
}
Run Code Online (Sandbox Code Playgroud)

或者有一个功能可以为我处理这个?

Ous*_* D. 17

使用merge.

hashMap.merge(ch, 1, (left, right) -> left + right);
Run Code Online (Sandbox Code Playgroud)

或使用方法参考:

 hashMap.merge(ch, 1, Math::addExact);
Run Code Online (Sandbox Code Playgroud)
  • 如果指定的键(ch在这种情况下)尚未与值关联或与null关联,则将其与给定的非空值(1在本例中)相关联.
  • 如果指定的键与非空值相关联,则它将相关值替换为给定重映射函数的结果(left, right) -> left + right.


ern*_*t_k 12

你不必.Map有一个merge方法,您可以使用它来更新值:

hashMap.merge(ch, 1, (oldVal, newVal) -> oldVal + newVal);
Run Code Online (Sandbox Code Playgroud)

那是做什么的:

  • 如果hashMap还没有ch密钥,则添加一个新条目ch作为键和1
  • 如果hashMap已经有一个带有ch键的条目,则调用最后一个函数来计算更新值.在这种情况下,(oldVal, newVal) -> oldVal + newVal只需将旧值添加到新值即可.

正如Andy的评论所指出,你也可以使用Map.compute:

int newValue = hashMap.compute(ch, 
      (key, existingVal) -> (existingVal == null) ? 1 : existingVal + 1);
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`compute`(我认为合并是使用它实现的). (3认同)