Статьи
Утилиты Telegram YouTube Отзывы

Удобные методы работы с Map

28 апреля 2018

Тэги: Collections, Java.

Содержание

  1. Обход всей коллекции в цикле
  2. Значение по умолчанию
  3. Вставка элемента с проверкой
  4. Предварительная инициализация значения
  5. Слияние значений
  6. Выводы

В Java 8 базовый интерфейс Map расширился новыми полезными методами. На конкретных примерах я покажу, как приходилось работать с этим типом коллекций раньше, и как легко с ним стало работать теперь.

Обход всей коллекции в цикле

Для того, чтобы пройтись по всем элементам коллекции и вывести значения на экран, раньше мы бы писали такой код:

for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getValue());
}

В java 8 появился метод foreach(), который принимает лямбда-функцию из двух параметров: ключ и значение. Указанный выше код можно записать одной строкой:

map.forEach((k, v) -> System.out.println(v));

Значение по умолчанию

Если в объекте типа Map нет значения по указанному ключу, то мы получим null. Если потом с объектом предполагается выполнить какие-то действия, то мы рискуем получить NullPointerException. Чтобы обезопасить себя от исключения, раньше мы бы писали так:

SomeClass c = map.get("key");
if (c == null) {
    c = new SomeClass();
}
c.someMethod();

Теперь у нас есть метод getOrDefault(), позволяющий задать значение по умолчанию:

map.getOrDefault("key", new SomeClass()).someMethod();

Вставка элемента с проверкой

Используя метод put(), мы можем добавлять новые элементы. Если же по данному ключу элемент уже был, то повторный вызов заменит это значение. Если же мы хотим предварительно проверить, нет ли уже такого элемента, то раньше мы бы писали такой код:

if (!map.containsKey("key")) {
    map.put("key", "value");
}

Теперь есть специальный метод putIfAbsent(), делающий ровно то же самое:

map.putIfAbsent("key", "value");

Предварительная инициализация значения

Часто в качестве значения Map лежит какой-нибудь список. И чтобы добавить в этот список новый элемент по указанному ключу, нам нужно предварительно убедиться, что список инициализирован. Раньше мы бы писали так:

if (!map.containsKey("key")) {
    map.put("key", new ArrayList<>());
}
map.get("key").add("value");

Теперь используем лямбда-функцию в методе computeIfAbsent(), которая вызывается только в том случае, если ключа ещё нет в нашей мапе:

map.computeIfAbsent("key", k -> new ArrayList<>()).add("value");

Слияние значений

Бывает и такое, что в Map в качестве значений лежат некие числовые показатели, например, счётчики. И при возникновении нового значения, мы не должны потерять старое значение, если оно есть. Мы должны просуммировать его с новым:

Integer oldValue = map.get("key");
if (oldValue == null) {
    map.put("key", newValue);
} else {
    map.put("key", oldValue + newValue);
}

Благодаря методу merge() весь указанный выше код может быть переписан с использованием лямбды:

map.merge("key", newValue, (x, y) -> x + y);

Выводы

Как видим, в Java 8 появился ряд новых удобных методов по работе с Map, которые позволяют выполнять рутинные операции буквально в одну строчку, используя лямбда-выражения.



Комментарии

Добавить комментарий

×

devmark.ru