Java 填充哈希映射时绕过空检查

Java 填充哈希映射时绕过空检查,java,hashmap,Java,Hashmap,在插入hashmap时,我是否总是必须检查是否有与插入的键对应的空值 例如,如果我想使用hashmap跟踪字符在单词中出现的次数,我是否必须始终执行以下操作: if(hashMap.containsKey(ch)){ hashMap.replace(ch, 1+hashMap.get(ch)); } else{ hashMap.put(ch, 1); } 或者是否有一个函数可以为我处理此问题?使用 或使用方法引用: hashMap.merge(ch, 1, M

在插入hashmap时,我是否总是必须检查是否有与插入的键对应的空值

例如,如果我想使用hashmap跟踪字符在单词中出现的次数,我是否必须始终执行以下操作:

if(hashMap.containsKey(ch)){
    hashMap.replace(ch, 1+hashMap.get(ch));    
}
else{
    hashMap.put(ch, 1);    
}
或者是否有一个函数可以为我处理此问题?

使用

或使用方法引用:

 hashMap.merge(ch, 1, Math::addExact);
  • 如果指定的键(
    ch,在本例中为
    )尚未与值关联或与null关联,则将其与给定的非null值(
    1,在本例中为
    )关联
  • 如果指定的键与非空值相关联,则它将用给定的重新映射函数
    (左、右)->左+右
    的结果替换关联的值
      你不必这么做<代码>映射有一个
      合并
      方法,可用于更新值:

      hashMap.merge(ch, 1, (oldVal, newVal) -> oldVal + newVal);
      
      这意味着什么:

      • 如果
        hashMap
        没有
        ch
        键,则添加一个新条目,其中
        ch
        作为键,
        1
        作为值
      • 如果
        hashMap
        已经有一个以
        ch
        为键的条目,则调用最后一个函数来计算更新值。在这种情况下,
        (oldVal,newVal)->oldVal+newVal
        只是将旧值添加到新值中
      如中所述,您还可以使用
      Map.compute

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

      为了清楚起见,您不必区分该键是否已经存在于地图中。换句话说,您可以使用
      put
      ,而不是在示例中使用
      replace

      当然,您确实需要处理是否有需要包含在更新值中的先前值。正如其他人所指出的,您可以使用
      merge
      compute
      方法

      但是,如果您有理由坚持使用
      put
      ,下面是一些关于如何构造代码的想法

      在原始代码中

      if(hashMap.containsKey(ch)){
          hashMap.replace(ch, 1+hashMap.get(ch));    
      }
      else{
          hashMap.put(ch, 1);    
      }
      
      您可以调用
      containsKey
      get
      ,这两个函数基本上都进行查找。为什么要查找两次

      Integer count = hashMap.get(ch);
      if(count != null){
          hashMap.replace(ch, 1+count);    
      }
      else{
          hashMap.put(ch, 1);    
      }
      
      不必对一种情况使用
      replace
      ,而对另一种情况使用
      put
      ,您可以同样轻松地对这两种情况使用
      put
      。您可以将以下情况结合起来:

      Integer count = hashMap.get(ch);
      if (count == null) {
          count = 0;
      }
      hashMap.put(ch, count + 1); 
      
      我发现这个模式非常有用,并且出现了很多(至少在我所处理的应用程序中)。我是这样想的:

      // Get the current value.
      Integer count = hashMap.get(ch);
      if (count == null) {
          // Business logic for initial value.
          count = 0;
      }
      
      // Compute the new value (might be a bunch of business logic).
      count++;
      
      // Put the new value back.
      hashMap.put(ch, count); 
      

      您还可以使用
      compute
      (我认为merge是使用它实现的)。这有点晚了,但不是
      hashMap.put(ch,hashMap.getOrDefault(ch,0)+1)是否也是有效的选项?
      
      // Get the current value.
      Integer count = hashMap.get(ch);
      if (count == null) {
          // Business logic for initial value.
          count = 0;
      }
      
      // Compute the new value (might be a bunch of business logic).
      count++;
      
      // Put the new value back.
      hashMap.put(ch, count);