在填充哈希映射时规避空检查

2022-09-03 05:03:11

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

例如,如果我想使用哈希映射跟踪一个字符在单词中出现的次数,我总是必须这样做:

if(hashMap.containsKey(ch)){
    hashMap.replace(ch, 1+hashMap.get(ch));    
}
else{
    hashMap.put(ch, 1);    
}

或者有没有一个函数可以为我处理这个问题?


答案 1

使用合并

hashMap.merge(ch, 1, (left, right) -> left + right);

或使用方法引用:

 hashMap.merge(ch, 1, Math::addExact);
  • 如果指定的键(在本例中)尚未与值关联或与 null 关联,请将其与给定的非 null 值相关联(在本例中)。ch1
  • 如果指定的键与非空值相关联,则它将用给定的重新映射函数的结果替换关联的值。(left, right) -> left + right

答案 2

您不必这样做。 具有可用于更新值的方法:Mapmerge

hashMap.merge(ch, 1, (oldVal, newVal) -> oldVal + newVal);

它的作用:

  • 如果还没有键,则添加一个新条目,其中包含 as key 和 as valuehashMapchch1
  • 如果已经有一个带有 as 键的条目,则调用最后一个函数来计算更新值。在这种情况下,只需将旧值添加到新值中即可。hashMapch(oldVal, newVal) -> oldVal + newVal

正如Andy的评论中指出的那样,您也可以使用:Map.compute

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