Java carte.get(clé) - automatiquement ne put(clé) et du retour si la clé n'existe pas?
Je suis malade, sur le modèle suivant:
value = map.get(key);
if (value == null) {
value = new Object();
map.put(key, value);
}
Cet exemple ne fait qu'effleurer la surface de la surcharge de code à écrire quand vous avez imbriqué des cartes pour représenter une structure multidimensionnelle.
Je suis sûr que quelque chose quelque part existe pour éviter cela, mais mon Googler efforts a abouti à rien de pertinent. Des suggestions?
- Par curiosité, l'Objet que vous voulez mettre, c'est juste un Objet, ou le type de varier? Aussi, est-il déjà créé ou devrait-il être créé uniquement si aucun objet n'existe déjà?
- Le type est connu au moment de la compilation. Habituellement, c'est une Chaîne à la Carte (à la Carte)* en Entier.
Vous devez vous connecter pour publier un commentaire.
La
et de Java 8
a
qui retourne la valeur de mapped à clé ou d'insérer la valeur null si aucune valeur n'est mappé pour la clé.
Si vous avez besoin d'paresseux évaluation de la valeur y est
new Object()
, cela peut être négligeable.computeIfAbsent
comme indiqué par @itakeJava 8 ajoute nice méthode à la Carte: calculer, computeIfPresent, computeIfAbsent
Pour obtenir ce dont vous avez besoin:
Le problème avec ce modèle est que vous devez en quelque sorte de définir la valeur qui devrait être utilisé dans le cas où le
get()
renvoie la valeur null.Il y a certainement bibliothèques et autant que je me souvienne il y a aussi quelques collections récentes qui le font, mais malheureusement je ne me souviens pas de ceux qui ont été.
Cependant, vous pourriez écrire une méthode utilitaire vous-même, à condition d'avoir un moyen standard de création de nouvelles valeurs. Quelque chose comme cela peut fonctionner:
Noter que vous devez soit avoir à jeter la réflexion exceptions ou de les manipuler dans la méthode. En outre, cela nécessite la
valueClass
de fournir un constructeur sans argument. Sinon, vous pouvez tout simplement passer à la valeur par défaut qui doit être utilisé.Vous pouvez utiliser MutableMap et
getIfAbsentPut()
de Eclipse Collections qui retourne la valeur de mapped à la clé ou insère la valeur donnée et renvoie la valeur donnée si aucune valeur n'est mappé à la clé.Vous pouvez soit utiliser une méthode de référence pour créer un nouveau
Object
:Ou vous pouvez directement créer un nouveau
Object
:Dans le premier exemple, l'objet sera créé uniquement si aucune valeur n'est mappé à la clé.
Dans le deuxième exemple, l'objet sera créé, peu importe.
Remarque: je suis un contributeur à Eclipse Collections.
EDIT : Noter que la caractéristique mentionnée ci-dessous est longtemps obsolète, et une CacheBuilder devrait être utilisé à la place.
La Goyave la bibliothèque dispose d'un "le calcul de la carte", voir Cartographe.makeComputingMap(Fonction).
Si vous avez besoin de la Fonction plusieurs fois, l'extraire dans une classe utilitaire, puis créer la Carte comme ceci (où
MyFunctions.NEW_OBJECT
est la Fonction statique exemple):MapMaker
de Google Goyave est mort. Ref: code.google.com/p/guava-libraries/wiki/MapMakerMigrationMap.get()
est mauvais, parce qu'il rompt leMap
contrat. Si vous utilisez le calcul de la carte à l'intérieur, il devrait être facile à utiliser unLoadingCache
à la place. Je peux voir leur point d'une catastrophe en attente de se produire quand on partage un ordinateur avec carte de la méfiance du code. Pour ce cas d'utilisation, on devrait utiliser unesafeGet()
fonction d'utilité comme celui donné par Thomas dans sa réponse.En tout cas, vous avez besoin d'un défaut de données dans votre carte si elle n'est pas existante
la documentation javadoc
Peut-être que je ne vois pas l'ensemble du problème, mais comment au sujet de l'utilisation de l'héritage ou de la composition d'ajouter ce comportement à l'objet Map?