CodeGym /Java блог /Случаен /Метод HashMap computeIfAbsent() в Java
John Squirrels
Ниво
San Francisco

Метод HashMap computeIfAbsent() в Java

Публикувано в групата
Java 8, Howто много от нас знаят, представи Stream API. Това е много полезен инструментариум, но има недостатък, не включва Map s. Въпреки това, Java 8 добави няколко полезни метода към самия интерфейс Map , за да намали количеството на "лошия" code. Така че, ако трябва да извършите няHowво действие със стойността в Map , ако тя съществува в нея, има метод ComputeIfPresent() в Java Map. Ако трябва да направите нещо със стойност, която не е в Map , можете да използвате метода ComputeIfAbsent() . Ще го разгледаме в тази статия.

computeIfAbsent() подпис на метода


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
Методът Map (и HashMap ) computeIfAbsent () приема два параметъра. Първият параметър е ключът. Вторият параметър е mappingFunction . При този метод функцията за картографиране се извиква само ако картографирането не е представено.

Как работи методът computeIfAbsent().

Както вече знаем, на метода Map.computeIfAbsent() се подават два параметъра, ключът и функцията за изчисляване на стойността за този ключ mappingFunction . Ето логичния алгоритъм на метода:
  1. Методът първо проверява дали предаденият ключ е представен в нашата карта .
  2. Ако ключът е представен в Map (и не е null), тогава методът не прави нищо.
  3. В противен случай, ако ключът не представлява в Map (or е нула), методът изчислява стойността с помощта на mappingFunction към ключа.
  4. Ако получената стойност не е нулева, тогава напишете двойка ключ-стойност за картографиране.
Нека напишем същата логика като code:

if (map.get(key) == null) 
{ 
V newValue = mappingFunction.apply(key); 
if (newValue != null) map.put(key, newValue); 
}

пример за code computeIfAbsent().

Така че, ако стойността не е в Map , тогава методът ще извърши промените. Нека да разгледаме един прост пример:

import java.util.HashMap;
import java.util.Map;

//map.computeIfAbsent example 
public class ComputeIfAbsentExample {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
Резултатът е:
ето моят ключ и това е нова стойност
Сега нека видим Howво ще направи методът, когато има дадена стойност в Map . Сигнал за спойлер: Няма да направи нищо.

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample2 {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();
           myMap.put("here is my key", "and here is my value");

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
Ето резултата:
и ето моята стойност
Както можете да видите, стойността остава непроменена.

Още един пример за ComputeIfAbsent().

Ако сте запознати с концепцията за кеширане, методът computeIfAbsent() вероятно ви напомня за нещо. Нека да разгледаме по-сложен пример за разбор. Нека извикаме метода computeIfAbsent() два пъти, за да сме сигурни, че в първия случай стойността се променя, докато във втория не.

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample {
   private static Map<String, Long> numbersMap = new HashMap<>();

   public static Long stringToLong(String str) {
       return numbersMap.computeIfAbsent(str, key -> {
           System.out.println("parsing: " + key);
           return Long.parseLong(key);
       });
   }

   public static void main(String[] args) {
       // will print:
       // > parsing: 10
       // > parsing: 25
       // > 10+25=35
       System.out.println("10+25=" + (stringToLong("10") + stringToLong("25")));
       // will print:
       // > parsing: 20
       // > 10+25=45
       // only "20" will be parsed this time, since "25" was already parsed and placed into `numbersMap` map before
       System.out.println("20+25=" + (stringToLong("20") + stringToLong("25")));
       // will print:
       // > 10+20=30
       // no parsing will occur, since both "10" and "20" were already parsed and placed into `numbersMap` map before
       System.out.println("10+20=" + (stringToLong("10") + stringToLong("20")));
   }

}
Ето резултата:
анализ: 10 анализ: 25 10+25=35 анализ: 20 20+25=45 10+20=30
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION