На це питання вже відповіли. Я зайняв трохи часу, щоб зрозуміти ("дорогу операцію не потрібно виконувати на випадок, якщо карта вже містить значення для зазначеного ключа в computeIfAbsent"), я вкладаю своє розуміння тут. Сподіваюся, це буде корисно для інших:
putIfAbsent()
поводиться просто так, put()
коли карта вже містить значення для вказаного ключа. putIfAbsent()
лише перевіряє, чи є ключ нульовим чи ні. Якщо воно не є нульовим, воно повертає значення, а потім знову отримує це значення.
Однак computeIfAbsent()
там є нульова перевірка як ключа, так і значення. Під час перевірки значення NULL на значення, якщо воно не має значення NULL, тоді існуюче значення з об'єкта карти призначається newValue і воно повертається Ось чому немає необхідності знову отримувати значення, оскільки існуюче значення з карти використовується повторно.
Зверніться до наступної програми для довідки:
public class MapTest1 {
public static final String AJAY_DEVGAN = "Ajay Devgn";
public static final String AUTOBIOGRAPHY = "Autobiography";
public static void main(String[] args) {
MapTest1 mt = new MapTest1();
mt.testPutCompute();
}
private void testPutCompute() {
Map<String, List<String>> movies = getMovieObject();
System.out.println("\nCalling putIfAbsent method.....");
movies.putIfAbsent(AJAY_DEVGAN, getAjayDevgnMovies());
System.out.println("\nCalling computeIfAbsent method......");
movies.computeIfAbsent(AUTOBIOGRAPHY, t -> getAutobiographyMovies());
}
private Map<String, List<String>> getMovieObject() {
Map<String, List<String>> movies = new HashMap<>();
movies.put(AJAY_DEVGAN, getAjayDevgnMovies());
movies.put(AUTOBIOGRAPHY, getAutobiographyMovies());
System.out.println(movies);
return movies;
}
private List<String> getAutobiographyMovies() {
System.out.println("Getting autobiography movies");
List<String> list = new ArrayList<>();
list.add("M.S. Dhoni - The Untold Story");
list.add("Sachin: A Billion Dreams");
return list;
}
private List<String> getAjayDevgnMovies() {
System.out.println("Getting Ajay Devgn Movies");
List<String> ajayDevgnMovies = new ArrayList<>();
ajayDevgnMovies.add("Jigar");
ajayDevgnMovies.add("Pyar To Hona Hi Tha");
return ajayDevgnMovies;
}
}
Зверніться до наступного коду для putIfAbsent()
та computeIfAbsent()
з інтерфейсуMap.class
public interface Map<K,V> {
.....
default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}
return v;
}
default V computeIfAbsent(K key,
Function<? super K, ? extends V> mappingFunction) {
Objects.requireNonNull(mappingFunction);
V v;
if ((v = get(key)) == null) {
V newValue;
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
.........
}