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 . Ето логичния алгоритъм на метода:- Методът първо проверява дали предаденият ключ е представен в нашата карта .
- Ако ключът е представен в Map (и не е null), тогава методът не прави нищо.
- В противен случай, ако ключът не представлява в Map (or е нула), методът изчислява стойността с помощта на mappingFunction към ключа.
- Ако получената стойност не е нулева, тогава напишете двойка ключ-стойност за картографиране.
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
GO TO FULL VERSION