AXOPEN

JAVA 8 – Map – ComputeIfAbsent pour la gestion des caches

Nous allons dans cet article découvrir une nouveauté de JAVA 8 bien pratique pour l’interface Map : la méthode computeIfAbsent.

Utilisation des maps

Un exemple courant d’utilisation des maps est la création de caches applicatifs: on utilise généralement une HashMap dans laquelle on enregistre les éléments que l’on utilise souvent. Chaque élément est indexé par une clé qui permet de retrouver l’élément désiré. La majorité du temps, le fonctionnement d’un tel cas est le suivant : on cherche si l’objet est présent dans le cache, si oui, on le récupère, sinon on le construit et on le stocke dans la HashMap. Cette phase de construction peut être coûteuse car elle correspond souvent à un appel WebService ou à un accès en base de données.

En JAVA 7 et antérieur

On applique l’algorithme décrit précédemment : ici, on recherche une commande par son id. Cela nécessite 8 lignes de code :

private static Commande getCommandeById(int id, HashMap hashMap) {
 if (hashMap.containsKey(id)) {
    return hashMap.get(id);
 } else {
    Commande commande = new Commande(id); // Ou récupération depuis la base de données
    hashMap.put(id, commande);
    return commande;
 }

En JAVA 8: ComputeIfAbsent

Depuis JAVA 8, il est possible de faire la même chose en une seul ligne :

private static Commande getCommandeById2(int id, HashMap hashMap) {
   return hashMap.computeIfAbsent(id, x -> new Commande(x));
 }

La méthode computeIfAbsent est invoquée de la suivante : le premier paramètre est la clé pour rechercher l’élément dans la Map, le deuxième est la méthode à appliquer pour construire l’élément s’il n’existe pas. Ce fonctionnement se base sur l’écriture LAMBDA pour le fournisseur de l’objet recherché. On constate immédiatement la simplicité de l’utilisation des Lambda Expressions dans ce genre de cas !

Performance :

Qui dit nouvelle façon d’écrire dit tests de performance. Est-ce que cette nouvelle façon d’écrire l’accès et le peuplement d’une HashMap est aussi performante que l’ancienne ? Afin de benchmarker la solution, nous avons réalisé le petit test suivant : l’ajout dans une HashMap de 500 000 éléments avec la méthode « JAVA 7 » et avec l’utilisation des LAMBDA « JAVA 8 ». Le résultat est sans appel avec exactement le même temps.

Conclusion sur computeIfAbsent

L’utilisation de computeIfAbsent simplifie significativement la quantité de code à écrire et s’avère être particulièrement lisible. Aucun défaut de performance n’est à déplorer quant à l’utilisation de cette méthode que l’on peut donc utiliser sans modération !