Groovy — как получить значение карты по умолчанию без обновления карты

#map #groovy

#словарь #groovy

Вопрос:

Как прочитать значение для данного ключа с карты, указав значение по умолчанию (используется, если карта не содержит записи для указанного ключа), но без обновления карты — это то, что get делает метод:

get(Object key, Object defaultValue)

Ищет элемент на карте для данного ключа и возвращает значение — если для данного ключа нет записи, и в этом случае добавьте значение по умолчанию на карту и верните его.

  1. Ofc это должно быть одно короткое выражение
  2. По соображениям производительности создание deepcopy на этой карте (чтобы ее можно было обновить) и использование упомянутого get не является решением.

Эквиваленты на разных языках:

  • JavaScript: map["someKey"] || "defaultValue"
  • Scala: map.getOrElse("someKey", "defaultValue")
  • Python3: map.get("someKey", "defaultValue")

Ответ №1:

Используйте метод Java getOrDefault Map (начиная с Java 8):

 map.getOrDefault("someKey", "defaultValue")
  

это не добавит новый ключ к карте.

Ответ №2:

Учитывая примеры, которые вы привели для некоторых других языков, и ваше выраженное требование не обновлять карту, возможно, вы ищете что-то подобное…

 map.someKey ?: 'default value'
  

Обратите внимание, что при этом, если someKey существует, но значение на карте, связанное с этим ключом, равно нулю, нулю, false или чему-либо, что оценивается как false в соответствии с правилами Groovy truth, тогда будет возвращено значение по умолчанию, которое может быть или не быть тем, что вы хотите.

Более подробный подход может быть примерно таким…

 map.containsKey('someKey') ? map.someKey : 'default value'
  

Комментарии:

1. Правильно, но немного длинновато. Можно написать что-нибудь короче?

2. Требования не очень подробные, но если требование примерно такое: если карта содержит определенный ключ, верните это значение, в противном случае верните некоторое значение по умолчанию, которое я предоставил, И карта не должна быть изменена как часть процесса (что и выражено в исходном вопросе), тогдаЯ не знаю более короткого синтаксиса, чтобы выразить это. Вы можете метапрограммировать свой собственный метод на Map, который выполняет всю работу и может упростить вызов.

3. Спасибо @JeffScottBrown!