metodos java dictionary get null put

metodos - Java map.get(clave)-¿Poner(clave) y regresar automáticamente si la clave no existe?



hashmap en java (7)

Estoy harto del siguiente patrón:

value = map.get(key); if (value == null) { value = new Object(); map.put(key, value); }

Este ejemplo solo araña la superficie del código adicional que se escribirá cuando tenga mapas anidados para representar una estructura multidimensional.

Estoy seguro de que existe algo en alguna parte para evitar esto, pero mis esfuerzos en Google no arrojaron nada relevante. ¿Alguna sugerencia?


El problema con este patrón es que debe definir de alguna manera el valor que se debe usar en caso de que get() devuelva nulo.

Ciertamente hay bibliotecas y IIRC también hay algunas colecciones más nuevas que lo hacen, pero desafortunadamente no recuerdo cuáles fueron.

Sin embargo, usted mismo puede escribir un método de utilidad, siempre que tenga una forma estándar de crear los nuevos valores. Algo como esto podría funcionar:

public static <K, V> V safeGet(K key, Map<K,V> map, Class<V> valueClass) throws /*add exceptions*/ { V value = map.get(key); if( value == null ) { value = valueClass.newInstance(); map.put( key, value ); } return value; }

Tenga en cuenta que tendrá que lanzar las excepciones de reflexión o manejarlas en el método. Además, esto requiere que valueClass proporcione un constructor sin argumento. Alternativamente, simplemente puede pasar el valor predeterminado que se debe utilizar.



Puede usar MutableMap y getIfAbsentPut() de Eclipse Collections, que devuelve el valor asignado a la clave o inserta el valor dado y devuelve el valor dado si no se asigna ningún valor a la clave.

Puede usar una referencia de método para crear un nuevo Object :

MutableMap<String, Object> map = Maps.mutable.empty(); Object value = map.getIfAbsentPut("key", Object::new);

O puede crear directamente un nuevo Object :

MutableMap<String, Object> map = Maps.mutable.empty(); Object value = map.getIfAbsentPut("key", new Object());

En el primer ejemplo, el objeto se creará solo si no hay un valor asignado a la clave.

En el segundo ejemplo, el objeto se creará independientemente.

Nota: soy colaborador de las colecciones de Eclipse.


Si, en cualquier caso, necesitas obtener una información predeterminada en tu mapa si no existe

map.getOrDefault(key, defaultValue);

javadocs


Tal vez no estoy viendo todo el problema, pero ¿qué hay de usar la herencia o la composición para agregar este comportamiento al objeto Map?


los

java.util.concurrent.ConcurrentMap

y de Java 8

Java.util.Map

tiene

putIfAbsent(K key, V value)

que devuelve el valor asignado a la clave o inserta el valor dado y nulo si no se asigna ningún valor para la clave.

Si necesita una evaluación perezosa del valor, hay

computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction)


EDITAR: tenga en cuenta que la característica que se menciona a continuación está obsoleta desde hace mucho tiempo, y se debe CacheBuilder un CacheBuilder su lugar.

La biblioteca de Guava tiene un " mapa de computación ", vea MapMaker.makeComputingMap(Function) .

Map<String, Object> map = new MapMaker().makeComputingMap( new Function<String, Object>() { public String apply(Stringt) { return new Object(); } });

Si necesita la función varias veces, extráigala en una clase de utilidad y luego cree un mapa como este (donde MyFunctions.NEW_OBJECT es la instancia de la función estática):

Map<String, Object> map = new MapMaker() .makeComputingMap(MyFunctions.NEW_OBJECT);