Guava bietet uns großartige Factory-Methoden für Java-Typen, wie z Maps.newHashMap()
.
Aber gibt es auch Builder für Java Maps?
HashMap<String,Integer> m = Maps.BuildHashMap.
put("a",1).
put("b",2).
build();
java
collections
guava
Elazar Leibovich
quelle
quelle
Antworten:
Da Java 9-
Map
Schnittstelle enthält:Map.of(k1,v1, k2,v2, ..)
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..)
.Einschränkungen dieser Fabrikmethoden sind, dass sie:
null
s nicht als Schlüssel und / oder Werte halten (wenn Sie Nullen speichern müssen, schauen Sie sich andere Antworten an)Wenn wir eine veränderbare Karte benötigen (wie HashMap), können wir ihren Kopierkonstruktor verwenden und den Inhalt der über erstellten Karte kopieren lassen
Map.of(..)
quelle
null
Werte zulassen , was je nach Anwendungsfall ein Problem sein kann.Map.of(k1,v1, k2,v2, ...)
kann sicher verwendet werden, wenn wir nicht viele Werte haben. Bei einer größeren Anzahl von Werten erhaltenMap.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
wir besser lesbaren Code, der weniger fehleranfällig ist (es sei denn, ich habe Sie falsch verstanden).Für HashMaps gibt es so etwas nicht, aber Sie können eine ImmutableMap mit einem Builder erstellen:
Und wenn Sie eine veränderbare Map benötigen, können Sie diese einfach dem HashMap-Konstruktor zuführen.
quelle
ImmutableMap
unterstützt keinenull
Werte. Daher gibt es eine Einschränkung dieses Ansatzes: Sie können keine Werte in IhremHashMap
to festlegennull
.new HashMap
Java-Konstruktor anstelle der statischenMaps.newHashMap
Methode zu verwenden?Nicht ganz ein Builder, aber mit einem Initialisierer:
quelle
map instanceof HashMap
falsch machen ? Sieht nach einer nicht so tollen Idee aus.map.getClass()==HashMap.class
gibt false zurück. Aber das ist trotzdem ein dummer Test.HashMap.class.isInstance(map)
sollte bevorzugt werden, und das wird wahr zurückgeben.Dies ähnelt der akzeptierten Antwort, ist aber meiner Ansicht nach etwas sauberer:
Es gibt verschiedene Variationen der oben genannten Methode, und sie eignen sich hervorragend zum Erstellen statischer, unveränderlicher und unveränderlicher Karten.
quelle
Hier ist eine sehr einfache ...
dann
Siehe https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065
quelle
Ein einfacher Kartenersteller ist trivial zu schreiben:
quelle
Sie können verwenden:
Es ist nicht so edel und lesbar, macht aber die Arbeit.
quelle
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
, besser?HashMap
ist veränderlich; Es ist kein Baumeister erforderlich.quelle
ImmutableSet
. Wenn Sie wirklich möchten, dass es veränderbar ist, können Sie es im Konstruktor oder in einem Instanzinitialisierungsblock oder einem statischen Initialisierungsblock initialisieren, wenn es sich um ein statisches Feld handelt.ImmutableMap
dort offensichtlich sagen sollen .{{init();}}
(nicht im Konstruktor, da andere Konstruktoren dies möglicherweise vergessen). Und es ist schön, dass es eine Art atomare Aktion ist. Wenn die Karte flüchtig ist, stellen Sie bei der Initialisierung mit einem Builder sicher, dass sie immer entwedernull
oder im Endzustand ist und niemals zur Hälfte gefüllt ist.Sie können die fließende API in Eclipse-Sammlungen verwenden :
Hier ist ein Blog mit mehr Details und Beispielen.
Hinweis: Ich bin ein Committer für Eclipse-Sammlungen.
quelle
Ich hatte vor einiger Zeit eine ähnliche Anforderung. Es hat nichts mit Guave zu tun, aber Sie können so etwas tun, um eine sauber zu konstruieren
Map
mit einem fließenden Builder eine .Erstellen Sie eine Basisklasse, die Map erweitert.
Erstellen Sie dann den fließenden Builder mit Methoden, die Ihren Anforderungen entsprechen:
Sie können es dann folgendermaßen implementieren:
quelle
Das wollte ich schon immer, besonders beim Einrichten von Testgeräten. Schließlich entschied ich mich, einen einfachen, fließenden Builder zu schreiben, der jede Map-Implementierung erstellen kann - https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
quelle
Hier ist eine, die ich geschrieben habe
Sie verwenden es so:
quelle
Verwenden von Java 8:
Dies ist ein Ansatz von Java-9
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
Wie benutzt man:
quelle
Es gibt
ImmutableMap.builder()
in Guave.quelle
Unterstrich-Java kann Hashmap erstellen.
quelle