Рубрики
Без рубрики

Java – Как обновить значение ключа в HashMap

В этой статье показано несколько способов обновления или увеличения значения ключа в хэш-карте, обновленных примерами Java 8 с использованием compute, merge, computeIfPresent, computeIfAbsent и т. Д.

Автор оригинала: 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 обновляет его значение.

  Map map = 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 .

  Map map = 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() чтобы убедиться, что ключ существует, прежде чем обновлять значение ключа.

  Map map = 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 для предоставления значения по умолчанию для несуществующего ключа.

  Map map = 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() первый аргумент – это ключ карты, второй аргумент – значение по умолчанию, третий аргумент является бифункциональным для принятия двух аргументов и предоставления выходных данных для ключа.

  Map map = 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

Мы можем упростить лямбда-выражение с помощью ссылки на метод.

  Map map = 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

Этот компьютер похож на слияние ; первый аргумент – ключ Карты, а второй аргумент – Бифункция .

  Map map = 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) {

        Map map = 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представляет пример выведет нуль .

  Map map = 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 .

  Map map = 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) {

      Map map = 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 для обновления или увеличения значения ключа.

  Map map = 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 для обновления значения, только если ключ не существует.

  Map map = 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. Рекомендации

Оригинал: “https://mkyong.com/java/java-how-to-update-the-value-of-a-key-in-hashmap/”