Есть ли что-то вроде getOrDefault при помещении значения в карту java8? - PullRequest
0 голосов
/ 21 февраля 2019

В java8, когда мы получаем какое-то значение с карты, мы можем написать:

int keyCount=countMap.getOrDefault(key,0);

, что равно:

if(countMap.contains(key)){
    keyCount=countMap.get(key);
}else{
    keyCount=0;
}

Проблема в том, что существует какой-либо элегантный способзамените следующие коды:

if(countMap.keySet().contains(key)){
    countMap.put(key,countMap.get(key)+1);
}else{
    countMap.put(key,1);
}

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Как уже упоминалось в Holger, вы можете просто использовать Map.merge как:

countMap.merge(key, 1, Integer::sum)

Обратите внимание, что в документации также указывается его реализация:

По умолчаниюреализация эквивалентна выполнению следующих шагов для этой карты, а затем возврату текущего значения или нуля, если отсутствует:

V oldValue = map.get(key);
V newValue = (oldValue == null) ? value :
             remappingFunction.apply(oldValue, value);
if (newValue == null)
    map.remove(key);
else
    map.put(key, newValue);
0 голосов
/ 07 марта 2019

Для тех, кто не знаком с методом merge:

countMap.put(key, countMap.getOrDefault(key,0)+1);
0 голосов
/ 21 февраля 2019

Вы ищете метод compute, также добавленный в Java 8. Этот метод принимает ключ, который вы используете, а также BiFunction для вычисления того, каким должно быть новое значениена основе ключа и существующего значения.Так что в вашем случае это будет выглядеть примерно так:

countMap.compute(key, (k, oldValue) -> oldValue == null ? 1 : oldValue + 1);

Когда ключ, который вы даете, еще не существует на карте, oldValue в BiFunction будет null;если вы вернете null в BiFunction, на карту ничего не попадет.

Требуется немного привыкнуть, но это очень мощный метод, когда вы освоите его.Он может быть более читабельным (хотя и более многословным) со ссылкой на метод вместо встроенной лямбды:

    countMap.compute(key, this::incrementOrSetToOne);

    // ... some other code ...

    private Integer incrementOrSetToOne(KeyType key, Integer oldValue) {
        return oldValue == null ? 1 : oldValue + 1;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...