Просто чтобы прояснить, вам не нужно различать, существует ли ключ на карте или нет.Другими словами, вместо использования replace
в вашем примере, вы можете использовать put
.
Конечно, вам нужно иметь дело с тем, есть ли у вас предварительное значение, которое вам нужно включить вобновленное значение.Как уже отмечали другие, вы можете использовать методы 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);