Nous allons dans cet article découvrir une nouveauté de JAVA 8 bien pratique pour l’interface Map : la méthode computeIfAbsent.
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.
On applique l’algorithme 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 >}}
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 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 !
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.
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 !
Java 8 arrive avec une toute nouvelle API Stream qui utilise les Lambda. Cette nouvelle API offre la possibilité de simplifier l’écriture, d’améliorer la performance ainsi d’augmenter la lisibilité d’un certain nombre de code. Nous allons essayer ici de v
Découvrez comment la méthode computeIfAbsent (map) de Java 8 révolutionne la gestion des caches avec des gains de lisibilité et de simplicité.
Un besoin récurrent en Java 8 est la mise à jour des données à l’intérieur du cache : on veut alors modifier une valeur pour une clé existant dans la Map. C’est à ça que sert la méthode computeIfPresent.