JAVA 8 – Map – ComputeIfAbsent pour la gestion des caches

Tuto - JAVA 8 – Map – ComputeIfAbsent pour la gestion des caches
Pierre LISERONMis à jour le 14 Mai 2014

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

Utilisation des maps

Un exemple courant dutilisation des maps est la création de caches applicatifs: on utilise généralement une HashMap dans laquelle on enregistre les éléments que lon 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 dun tel cas est le suivant : on cherche si lobjet 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 lalgorithme décrit précédemment : ici, on recherche une commande par son id. Cela nécessite 8 lignes de code :

{{< highlight java >}} private static Commande getCommandeById(int id, HashMap< Integer, Commande> 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; } {{< /highlight >}}

En JAVA 8: ComputeIfAbsent

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

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

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 sil nexiste pas. Ce fonctionnement se base sur lécriture LAMBDA pour le fournisseur de lobjet recherché. On constate immédiatement la simplicité de lutilisation 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 laccès et le peuplement dune HashMap est aussi performante que lancienne ? Afin de benchmarker la solution, nous avons réalisé le petit test suivant : lajout dans une HashMap de 500 000 éléments avec la méthode « JAVA 7 » et avec lutilisation des LAMBDA « JAVA 8 ». Le résultat est sans appel avec exactement le même temps.

Conclusion sur computeIfAbsent

Lutilisation de computeIfAbsent simplifie significativement la quantité de code à écrire et savère être particulièrement lisible. Aucun défaut de performance nest à déplorer quant à lutilisation de cette méthode que lon peut donc utiliser sans modération !