#map #groovy
#словарь #groovy
Вопрос:
Как прочитать значение для данного ключа с карты, указав значение по умолчанию (используется, если карта не содержит записи для указанного ключа), но без обновления карты — это то, что get
делает метод:
get(Object key, Object defaultValue)
Ищет элемент на карте для данного ключа и возвращает значение — если для данного ключа нет записи, и в этом случае добавьте значение по умолчанию на карту и верните его.
- Ofc это должно быть одно короткое выражение
- По соображениям производительности создание 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!