Guava nous fournit d'excellentes méthodes d'usine pour les types Java, tels que Maps.newHashMap()
.
Mais existe-t-il aussi des constructeurs pour Java Maps?
HashMap<String,Integer> m = Maps.BuildHashMap.
put("a",1).
put("b",2).
build();
java
collections
guava
Elazar Leibovich
la source
la source
Réponses:
Puisque l'
Map
interface Java 9 contient:Map.of(k1,v1, k2,v2, ..)
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..)
.Les limites de ces méthodes d'usine sont qu'elles:
null
s comme clés et / ou valeurs (si vous avez besoin de stocker des valeurs nulles, jetez un œil à d'autres réponses)Si nous avons besoin d'une carte mutable (comme HashMap), nous pouvons utiliser son constructeur de copie et le laisser copier le contenu de la carte créée via
Map.of(..)
la source
null
valeurs, ce qui peut poser problème selon le cas d'utilisation.Map.of(k1,v1, k2,v2, ...)
peut être utilisé en toute sécurité lorsque nous n'avons pas beaucoup de valeurs. Pour une plus grande quantité de valeursMap.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
nous donne un code plus lisible qui est moins sujet aux erreurs (sauf si je vous ai mal compris).Il n'y a rien de tel pour HashMaps, mais vous pouvez créer un ImmutableMap avec un générateur:
Et si vous avez besoin d'une carte mutable, vous pouvez simplement la transmettre au constructeur HashMap.
la source
ImmutableMap
ne prend pas en charge lesnull
valeurs. Il y a donc une limitation de cette approche: vous ne pouvez pas définir de valeurs dans votreHashMap
tonull
.new HashMap
constructeur Java au lieu de laMaps.newHashMap
méthode statique ?Pas tout à fait un constructeur, mais utilisant un initialiseur:
la source
map instanceof HashMap
faux? Cela semble être une idée pas terrible.map.getClass()==HashMap.class
renverra false. Mais c'est un test stupide de toute façon.HashMap.class.isInstance(map)
devrait être préféré, et cela retournera vrai.C'est similaire à la réponse acceptée, mais un peu plus propre, à mon avis:
Il existe plusieurs variantes de la méthode ci-dessus, et elles sont parfaites pour créer des cartes statiques, immuables et immuables.
la source
En voici un très simple ...
puis
Voir https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065
la source
Un simple constructeur de carte est simple à écrire:
la source
Vous pouvez utiliser:
Ce n'est pas aussi élégant et lisible, mais fait le travail.
la source
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
, meilleur?HashMap
est mutable; il n'y a pas besoin de constructeur.la source
ImmutableSet
. Si vous voulez vraiment qu'il soit modifiable, vous pouvez l'initialiser dans le constructeur ou un bloc d'initialisation d'instance ou un bloc d'initialisation statique s'il s'agit d'un champ statique.ImmutableMap
évidemment.{{init();}}
(pas dans le constructeur, car d'autres constructeurs pourraient l'oublier). Et c'est bien que ce soit une sorte d'action atomique. Si la carte est volatile, l'initialiser avec un constructeur garantit qu'elle est toujours soitnull
ou dans l'état final, jamais à moitié remplie.Vous pouvez utiliser l'API fluent dans les collections Eclipse :
Voici un blog avec plus de détails et d'exemples.
Remarque: je suis un committer pour les collections Eclipse.
la source
J'avais une exigence similaire il y a quelque temps. Cela n'a rien à voir avec la goyave mais vous pouvez faire quelque chose comme ça pour être en mesure de construire proprement un
Map
utilisant un constructeur couramment.Créez une classe de base qui étend Map.
Ensuite, créez le constructeur fluide avec des méthodes adaptées à vos besoins:
Vous pouvez ensuite l'implémenter comme ceci:
la source
C'est quelque chose que j'ai toujours voulu, en particulier lors de la configuration des montages de test. Enfin, j'ai décidé d'écrire un constructeur simple et fluide qui pourrait créer n'importe quelle implémentation de Map - https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
la source
En voici un que j'ai écrit
Vous l'utilisez comme ceci:
la source
En utilisant java 8:
C'est une approche de Java-9
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
Comment utiliser:
la source
Il y en a
ImmutableMap.builder()
à Guava.la source
Underscore-java peut construire hashmap.
la source