117 votes

Quelle est la différence entre putIfAbsent et computeIfAbsent dans Java 8 Carte ?

De la lecture des articles intéressants les gars prétend que la différence entre les deux fonction sont les suivantes:

Les deux fonctions aspire à ajouter un élément si la Clé spécifiée n'est pas déjà présents sur la Carte.

putIfAbsent ajoute un élément à la Valeur spécifiée alors que computeIfAbsent ajoute un élément à la valeur calculée à l'aide de la Clé. http://www.buggybread.com/2014/10/java-8-difference-between-map.html

Et

Nous avons vu que putIfAbsent supprime l'impératif d'avoir à définir le if, mais que faire si l'extraction de la Java des articles est vraiment du mal à nos performances?

Pour optimiser cela, nous ne voulons pas aller chercher les articles jusqu'à ce que nous sommes vraiment nous avons besoin d'eux - sens, nous avons besoin de savoir si la clé est absent avant de récupérer les articles. http://www.deadcoderising.com/2017-02-14-java-8-declarative-ways-of-modifying-a-map-using-compute-merge-and-replace/

Je n'ai pas prêt de comprendre quelles sont les différences pouvez-vous veuillez donner plus de détails sur ces deux fonctions ?

211voto

Andreas Points 3334

Différence #1

computeIfAbsent prend une fonction de mapping, qui est appelée pour obtenir la valeur si la clé est manquante.

putIfAbsent prend directement la valeur.

Si la valeur est coûteux à obtenir, alors putIfAbsent des déchets que si la clé existe déjà.

Une commune "cher" la valeur est new ArrayList<>() lorsque vous êtes en train de créer un Map<K, List<V>>, d'où la création d'une nouvelle liste si la clé existe déjà (ce qui annule la nouvelle liste) génère inutile d'ordures.


Différence #2

computeIfAbsent renvoie la "le courant (existant ou calculées) valeur associée à la clé spécifiée, ou null si la valeur calculée est nulle".

putIfAbsent renvoie "la précédente valeur associée à la clé spécifiée, ou null si il n'y avait pas de cartographie pour la clé".

Donc, si la clé existe déjà, ils reviennent à la même chose, mais si la clé est manquante, computeIfAbsent renvoie la valeur calculée, alors que putIfAbsent retourner la valeur null.


Différence #3

Les deux méthodes définir "absent" comme clé manquante ou existantes de la valeur est null, mais:

computeIfAbsent ne sera pas mis une valeur null si la clé est absente.

putIfAbsent va mettre la valeur si la clé est absente, même si la valeur est null.

Il ne fait aucune différence pour les futurs appels à l' computeIfAbsent, putIfAbsent, et get des appels, mais il y a une différence d'appels, comme getOrDefault et containsKey.

93voto

Eran Points 35360

Supposons que vous avez un Map<String,ValueClass>.

map.putIfAbsent("key", new ValueClass());

va créer un ValueClass instance de toute façon, même si la "clé" de la clé est déjà dans l' Map. Ce serait juste de créer inutilement un exemple.

Sur l'autre main

map.computeIfAbsent("key", k -> new ValueClass());

ne fera que créer un ValueClass exemple si la "clé" clé n'est pas déjà dans l' Map (ou est associé à un null de la valeur).

Par conséquent, computeIfAbsent est plus efficace.

putIfAbsent est équivalent à:

ValueClass value = new ValueClass();
if (map.get("key") == null) {
    map.put("key",value);
}

alors qu' computeIfAbsent est équivalent à:

if (map.get("key") == null) {
    map.put("key",new ValueClass());
}

Une autre petite différence entre les deux méthodes est qu' computeIfAbsent ne seront pas un null de la valeur pour l'absence de la clé. putIfAbsent sera.

12voto

Jesper Points 65733

Vous pouvez comprendre la différence en regardant attentivement les signatures de méthode:

  • putIfAbsent prend une clé et une valeur, et met la valeur dans la carte si il n'existe pas de valeur de cette clé dans la carte.
  • computeIfAbsent prend une clé et un Function. Si il n'existe pas de valeur de cette clé dans la carte, la fonction est appelée pour créer de la valeur, qui est ensuite mis dans la carte.

Si vous disposez déjà de la valeur, il faut utiliser putIfAbsent.

Si vous n'avez pas encore de valeur et la création de la valeur est une opération coûteuse (par exemple, la valeur doit être recherché dans une base de données), puis utilisez computeIfAbsent, de sorte que l'opération coûteuse n'a pas besoin d'être effectuée dans le cas où la carte contient déjà une valeur pour la clé spécifiée.

8voto

zlakad Points 1173

Peut-être que les implémentations par défaut peuvent clarifier un peu plus ....

``L'implémentation par défaut est équivalente à, pour cette carte :

D'un autre côté:

équivaut à :

1voto

minotna Points 39

V putIfAbsent(K key, V value) - Si la clé spécifiée n'est pas déjà associé à une valeur (ou est mappé à null), les tentatives de calculer sa valeur à l'aide de la fonction de mappage et il pénètre dans cette carte, à moins que la valeur null.

V computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) - Si la clé spécifiée n'est pas déjà associé à une valeur (ou est mappé à null), les tentatives de calculer sa valeur à l'aide de la fonction de mappage et il pénètre dans cette carte, à moins que la valeur null.

La lecture de la documentation peut vous donner une réponse plus évidente. https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X