CodeGym /Blog Java /Random-FR /Méthode HashMap computeIfAbsent() en Java
Auteur
Volodymyr Portianko
Java Engineer at Playtika

Méthode HashMap computeIfAbsent() en Java

Publié dans le groupe Random-FR
Java 8, comme beaucoup d'entre nous le savent, a introduit l'API Stream. C'est une boîte à outils très utile, mais elle a un inconvénient, elle n'inclut pas les cartes . Cependant, Java 8 a ajouté plusieurs méthodes utiles à l' interface Map elle-même pour réduire la quantité de "mauvais" code. Donc, si vous devez effectuer une action avec la valeur dans Map , si elle existe, il existe une méthode ComputeIfPresent() dans Java Map. Si vous devez faire quelque chose avec une valeur qui n'est pas dans Map , vous pouvez utiliser la méthode ComputeIfAbsent() . Nous l'examinerons dans cet article.

signature de la méthode computeIfAbsent()


default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
La méthode Map (et HashMap ) computeIfAbsent() prend deux paramètres. Le premier paramètre est la clé. Le deuxième paramètre est le mappingFunction . Dans cette méthode, la fonction de mappage n'est appelée que si le mappage n'est pas présenté.

Fonctionnement de la méthode computeIfAbsent()

Comme nous le savons déjà, la méthode Map.computeIfAbsent() reçoit deux paramètres, la clé et la fonction pour calculer la valeur de cette clé mappingFunction . Voici l'algorithme logique de la méthode :
  1. La méthode vérifie d'abord si la clé transmise est représentée dans notre Map .
  2. Si la clé est représentée dans Map (et qu'elle n'est pas nulle), la méthode ne fait rien.
  3. Sinon, si la clé n'est pas représentée dans Map (ou si elle est nulle), la méthode calcule la valeur en utilisant mappingFunction sur la clé.
  4. Si la valeur résultante n'est pas nulle, écrivez une paire clé-valeur à mapper.
Écrivons la même logique que le code :

if (map.get(key) == null) 
{ 
V newValue = mappingFunction.apply(key); 
if (newValue != null) map.put(key, newValue); 
}

exemple de code computeIfAbsent()

Ainsi, si la valeur n'est pas dans le Map , la méthode effectuera les modifications. Prenons un exemple simple :

import java.util.HashMap;
import java.util.Map;

//map.computeIfAbsent example 
public class ComputeIfAbsentExample {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
La sortie est:
voici ma clé, et c'est une nouvelle valeur
Voyons maintenant ce que la méthode fera lorsqu'il y a une valeur donnée dans le Map . Alerte spoiler : ça ne fera rien.

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample2 {

       public static void main(String[] args) {

           Map<String, String> myMap = new HashMap<>();
           myMap.put("here is my key", "and here is my value");

           myMap.computeIfAbsent("here is my key", key -> key + ", " + "and this is a new value");

           System.out.println(myMap.get("here is my key"));
       }
}
Voici la sortie:
et voici ma valeur
Comme vous pouvez le voir, la valeur reste inchangée.

Un autre exemple de ComputeIfAbsent()

Si vous connaissez le concept de mise en cache, la méthode computeIfAbsent() vous rappelle probablement quelque chose. Examinons un exemple d'analyse plus complexe. Appelons la méthode computeIfAbsent() deux fois pour nous assurer que dans le premier cas la valeur change, tandis que dans le second ce n'est pas le cas.

import java.util.HashMap;
import java.util.Map;

public class ComputeIfAbsentExample {
   private static Map<String, Long> numbersMap = new HashMap<>();

   public static Long stringToLong(String str) {
       return numbersMap.computeIfAbsent(str, key -> {
           System.out.println("parsing: " + key);
           return Long.parseLong(key);
       });
   }

   public static void main(String[] args) {
       // will print:
       // > parsing: 10
       // > parsing: 25
       // > 10+25=35
       System.out.println("10+25=" + (stringToLong("10") + stringToLong("25")));
       // will print:
       // > parsing: 20
       // > 10+25=45
       // only "20" will be parsed this time, since "25" was already parsed and placed into `numbersMap` map before
       System.out.println("20+25=" + (stringToLong("20") + stringToLong("25")));
       // will print:
       // > 10+20=30
       // no parsing will occur, since both "10" and "20" were already parsed and placed into `numbersMap` map before
       System.out.println("10+20=" + (stringToLong("10") + stringToLong("20")));
   }

}
Voici la sortie:
analyse : 10 analyse : 25 10+25=35 analyse : 20 20+25=45 10+20=30
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION