Rappels sur la mise à jour d'une HashMap


Rappel sur les HashMap

Pour mettre à jour une HashMap<K,V> efficacement (V non mutable) :

	map.merge(key, 1, Interger::sum); // ou map.merge(key, 1, (x,y) -> x + y);

équivaut à :

	map.compute(key,(k, v) -> {
		if (v == null) {
		  return 1;
		} else {
		  return v + 1;
		}
	});

Rappel sur les HashMap

Au pire, si vous n'y arrivez pas avec une lambda (V toujours non mutable):

	var oldValue = map.get(key); // fait office d'appel à map.contains(key)
	if (oldValue == null) { 									
		oldValue = initialValue;
	}	
	map.put(key, update(oldValue)); // update est un UnaryOperator<V>

Ou mieux :

	var oldValue = map.getOrDefault(key, 0); 
	map.put(key, update(oldValue)); // update est un UnaryOperator<V>

Rappel sur les HashMap

Pour mettre à jour une HashMap<K,V> efficacement (V mutable):

HashMap<Long,Data> map = ...

var data = map.computeIfAbsent<(key, k -> new Data());
data.update(newValue);

Par exemple :

HashMap<String,ArrayList<Integer>> map = ...

map.computeIfAbsent(key, k -> new ArrayList<>()).add(1);