Почему Java не использует метод putIfAbsent (ключ, поставщик) в Map?

Недавно я обнаружил, что хочу получить версию putIfAbsent (...) в java.util.Map, чтобы вы могли предоставить какой-то метод factory, чтобы создать экземпляр объекта, если он еще не присутствует. Это упростит много кода.

Вот мой измененный интерфейс:

import java.util.Map;
import java.util.function.Supplier;

/**
 * Extension of the Map Interface for a different approach on having putIfAbsent
 * 
 * @author Martin Braun
 */
public interface SupplierMap<K, V> extends Map<K, V> {

    public default V putIfAbsent(K key, Supplier<V> supplier) {
        V value = this.get(key);
        if(value == null) {
            this.put(key, value = supplier.get());
        }
        return value;
    }

}

Теперь мой вопрос: Есть ли другой (более простой) способ сделать это или я просто упустил что-то в Java API?

Ответы

Ответ 1

Не computeIfAbsent что вы хотите?

Если указанный ключ еще не связан со значением (или сопоставлен с нулем), пытается вычислить его значение с использованием заданного отображения и вводит его в эту карту, если не указано значение null.

Реализация - это что-то вроде:

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

Таким образом, это не точно подпись Supplier<V>, которую вы опубликовали, но близко к ней. Наличие ключа в качестве аргумента в функции отображения определенно имеет смысл.