1. Обзор
В этом кратком руководстве мы рассмотрим способы проверки наличия ключа в карте
.
В частности, мы сосредоточимся на containsKey
и get.
2. содержитКлюч
Если мы посмотрим на JavaDoc для Map#containsKey
:
Возвращает
true
, если эта карта содержит сопоставление для указанного ключа
Мы видим, что этот метод является довольно хорошим кандидатом для того, чтобы делать то, что мы хотим.
Давайте создадим очень простую карту и проверим ее содержимое с помощью containsKey
:
@Test
public void whenKeyIsPresent_thenContainsKeyReturnsTrue() {
Map<String, String> map = Collections.singletonMap("key", "value");
assertTrue(map.containsKey("key"));
assertFalse(map.containsKey("missing"));
}
Проще говоря, containsKey
сообщает нам, содержит ли карта этот ключ.
3. получить
Теперь get
тоже иногда может работать, но он имеет некоторый багаж, в зависимости от того, поддерживает ли реализация Map нулевые значения.
Снова взглянув на JavaDoc Map, на этот раз для Map
#put
, мы видим, что он вызовет только исключение NullPointerException
:
если указанный ключ или значение является нулевым, и эта карта не допускает нулевых ключей или значений
Поскольку некоторые реализации Map
могут иметь нулевые значения (например , HashMap
), get
может возвращать null
даже при наличии ключа.
Итак, если наша цель — увидеть, имеет ли ключ значение, то get
сработает:
@Test
public void whenKeyHasNullValue_thenGetStillWorks() {
Map<String, String> map = Collections.singletonMap("nothing", null);
assertTrue(map.containsKey("nothing"));
assertNull(map.get("nothing"));
}
Но если мы просто пытаемся проверить, что ключ существует, то мы должны использовать containsKey
.
4. Вывод
В этой статье мы рассмотрели containsKey
. Мы также более подробно рассмотрели, почему рискованно использовать get
для проверки существования ключа.
Как всегда, ознакомьтесь с примерами кода на Github .