Автор оригинала: mkyong.
В этой статье показано несколько способов обновления или увеличения значения ключа в хэш-карте.
Содержание
- 1. Обновите значение ключа в HashMap
- 2. Увеличьте значение ключа в HashMap
- 3. Java 8 getOrDefault()
- 4. Java 8 вычисляет и объединяет
- 4.1 Пример слияния Java 8
- 4.2 Вычисления на Java 8
- 5. Java 8 Вычислитьпредставитель
- 6. Java 8 computeIfAbsent и putIfAbsent
- 7. Рекомендации
1. Обновите значение ключа в HashMap
Если ключ не существует, метод put
создает ключ со связанным значением; если ключ существует, put
обновляет его значение.
Mapmap = new HashMap<>(); map.put("a", 1); System.out.println(map.get("a")); // 1 map.put("a", 2); // key `a` exists, update or replace the value System.out.println(map.get("a")); // 2
Выход
1 2
2. Увеличьте значение ключа в HashMap
2.1 Мы можем обновить или увеличить значение ключа с помощью приведенного ниже метода get() + 1
.
Mapmap = new HashMap<>(); // if key doesn't exist, throws NullPointerException map.put("count", map.get("count") + 1);
Выход
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.lang.Integer.intValue()" because the return value of "java.util.Map.get(Object)" is null
2.2 Однако описанный выше метод вызовет исключение NullPointerException
если ключ не существует. Исправлено, что используется containsKey()
чтобы убедиться, что ключ существует, прежде чем обновлять значение ключа.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { if (map.containsKey("count")) { map.put("count", map.get("count") + 1); } else { map.put("count", 1); } } System.out.println(map.get("count"));
Выход
10
Или один вкладыш, как показано ниже.
map.put("count", map.containsKey("count") ? map.get("count") + 1 : 1);
3. Java 8 getOrDefault()
В Java 8 мы можем использовать getOrDefault
для предоставления значения по умолчанию для несуществующего ключа.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // if key "count" doesn't exist, default to 0 map.put("count", map.getOrDefault("count", 0) + 1); } System.out.println(map.get("count"));
Выход
10
4. Java 8 вычисляет и объединяет
Java 8 также добавила вычисление()
и объединить()
для улучшения интерфейса Карты
. Приведенные ниже примеры увеличивают значение ключа в HashMap
.
Дальнейшее чтение Большинство новых API-интерфейсов Java 8 Map принимают либо Функцию
, либо бифункциональную
в качестве аргумента убедитесь, что вы понимаете концепцию следующих интерфейсов функций:
- Примеры функций Java 8
- Примеры функций Java 8 Bi
4.1 Пример слияния Java 8
Для merge()
первый аргумент – это ключ карты, второй аргумент – значение по умолчанию, третий аргумент является бифункциональным
для принятия двух аргументов и предоставления выходных данных для ключа.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // if key doesn't exist, default to 1 // lambda map.merge("count", 1, (v1, v2) -> v1 + v2); } System.out.println(map.get("count"));
Выход
10
Мы можем упростить лямбда-выражение с помощью ссылки на метод.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { map.merge("count", 1, Integer::sum); } System.out.println(map.get("count"));
4.2 Вычисления на Java 8
Этот компьютер
похож на слияние
; первый аргумент – ключ Карты, а второй аргумент – Бифункция
.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { map.compute("count", (k, v) -> (v == null) ? 1 : v + 1); } System.out.println(map.get("count"));
Выход
10
Еще одна Java 8 вычисление
пример увеличения значения ключа.
package com.mkyong.basic; import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // lambda //map.compute("count", (k, v) -> createDefault(k, v)); // method reference map.compute("count", TestMap::createDefault); } System.out.println(map.get("count")); } private static Integer createDefault(String key, Integer value) { if (value == null) { return 1; } return value + 1; } }
Выход
10
5. Java 8 Вычислитьпредставитель
В Computeifпредставитель
похож на компьютер
но запускает компьютерный метод только в том случае, если ключ присутствует или существует.
5.1 Приведенное ниже Computeifпредставляет
пример выведет нуль
.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // key count not exists, skip x 10 map.computeIfPresent("count", (k,v) -> v + 1); } System.out.println(map.get("count"));
Выход
null
5.2 Приведенное ниже computeifпредставляет
пример выведет 10
.
Mapmap = new HashMap<>(); map.put("count", 0); for (int i = 0; i < 10; i++) { // key exists, ok, run this map.computeIfPresent("count", (k, v) -> v + 1); } System.out.println(map.get("count"));
Выход
10
6. Java 8 computeIfAbsent и putIfAbsent
6.1 computeIfAbsent
аналогичен computeIfPresent
, но запускает метод вычисления только в том случае, если ключ ОТСУТСТВУЕТ или существует.
package com.mkyong.basic; import java.util.HashMap; import java.util.Map; public class TestMap { public static void main(String[] args) { Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { // run once only, if key doesn't exists, else skip this. map.computeIfAbsent("count", TestMap::createDefault); } System.out.println(map.get("count")); } private static Integer createDefault(String key) { System.out.println("Creating Default...."); if ("count".equalsIgnoreCase(key)) { return 0; } else { return -1; } } }
Выход
Creating Default.... 0
6.2 В приведенном ниже примере используется computeIfAbsent
для предоставления значения по умолчанию для ключа; computeIfPresent
для обновления или увеличения значения ключа.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { map.computeIfAbsent("count", TestMap::createDefault); // default 0 map.computeIfPresent("count", (k, v) -> v + 1); // increase +1 } System.out.println(map.get("count"));
Выход
Creating Default.... 10
6.3 Существует также putIfAbsent
для обновления значения, только если ключ не существует.
Mapmap = new HashMap<>(); for (int i = 0; i < 10; i++) { //map.computeIfAbsent("count", TestMap::createDefault); map.putIfAbsent("count", 0); map.computeIfPresent("count", (k, v) -> v + 1); } System.out.println(map.get("count"));
Разница в том, что computeIfAbsent
использует Функцию
для обновления значения; putIfAbsent
обновляет значение напрямую.
7. Рекомендации
- Карта JavaDoc
- Хеш-карта JavaDoc
- Бифункциональный JavaDoc
- Примеры функций Java 8
- Примеры функций Java 8 Bi
- Ява – Получить ключи из хэш-карты значений
- Как инициализировать хэш-карту в Java
Оригинал: “https://mkyong.com/java/java-how-to-update-the-value-of-a-key-in-hashmap/”