Java 填充哈希映射时绕过空检查
在插入hashmap时,我是否总是必须检查是否有与插入的键对应的空值 例如,如果我想使用hashmap跟踪字符在单词中出现的次数,我是否必须始终执行以下操作: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
if(hashMap.containsKey(ch)){
hashMap.replace(ch, 1+hashMap.get(ch));
}
else{
hashMap.put(ch, 1);
}
或者是否有一个函数可以为我处理此问题?使用
或使用方法引用:
hashMap.merge(ch, 1, Math::addExact);
- 如果指定的键(
)尚未与值关联或与null关联,则将其与给定的非null值(ch,在本例中为
)关联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);
您还可以使用
(我认为merge是使用它实现的)。这有点晚了,但不是compute
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);
- 如果