Guava zapewnia nam świetne metody fabryczne dla typów Java, takich jak Maps.newHashMap()
.
Ale czy są też konstruktorzy map Java?
HashMap<String,Integer> m = Maps.BuildHashMap.
put("a",1).
put("b",2).
build();
java
collections
guava
Elazar Leibovich
źródło
źródło
Odpowiedzi:
Ponieważ
Map
interfejs Java 9 zawiera:Map.of(k1,v1, k2,v2, ..)
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ..)
.Ograniczenia tych metod fabrycznych polegają na tym, że:
null
s jako kluczy i / lub wartości (jeśli chcesz przechowywać wartości null, spójrz na inne odpowiedzi)Jeśli potrzebujemy mapy mutowalnej (takiej jak HashMap), możemy użyć jej konstruktora kopiującego i pozwolić mu kopiować zawartość mapy utworzonej przez
Map.of(..)
źródło
null
wartości, co może stanowić problem w zależności od przypadku użycia.Map.of(k1,v1, k2,v2, ...)
może być bezpiecznie używane, gdy nie mamy wielu wartości. W przypadku większej ilości wartościMap.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
daje nam bardziej czytelny kod, który jest mniej podatny na błędy (chyba że źle cię zrozumiałem).Nie ma czegoś takiego w przypadku HashMaps, ale możesz utworzyć ImmutableMap za pomocą kreatora:
A jeśli potrzebujesz mutowalnej mapy, możesz po prostu przesłać ją do konstruktora HashMap.
źródło
ImmutableMap
nie obsługujenull
wartości. Jest więc ograniczenie tego podejścia: nie możesz ustawić wartości w swoimHashMap
tonull
.new HashMap
konstruktora Java zamiastMaps.newHashMap
metody statycznej ?Niezupełnie konstruktor, ale używając inicjatora:
źródło
map instanceof HashMap
fałsz? Wygląda na niezbyt dobry pomysł.map.getClass()==HashMap.class
zwróci false. Ale to i tak głupi test.HashMap.class.isInstance(map)
powinno być preferowane, a to zwróci wartość true.Jest to podobne do przyjętej odpowiedzi, ale moim zdaniem trochę jaśniejsze:
Istnieje kilka odmian powyższej metody, które świetnie nadają się do tworzenia statycznych, niezmiennych, niezmiennych map.
źródło
Oto bardzo prosty ...
następnie
Zobacz https://gist.github.com/culmat/a3bcc646fa4401641ac6eb01f3719065
źródło
Prosty kreator map jest trywialny do napisania:
źródło
Możesz użyć:
Nie jest tak elegancki i czytelny, ale działa.
źródło
Map<String, Integer> map = ImmutableMap.of("a", 1, "b", 2);
, lepszy?HashMap
jest zmienny; nie ma potrzeby budowania.źródło
ImmutableSet
. Jeśli naprawdę chcesz, aby był mutowalny, możesz zainicjować go w konstruktorze lub bloku inicjatora wystąpienia lub statycznym bloku inicjatora, jeśli jest to pole statyczne.ImmutableMap
tam oczywiście powiedzieć .{{init();}}
(nie w konstruktorze, ponieważ inny konstruktor może o tym zapomnieć). I fajnie, że to coś w rodzaju atomowej akcji. Jeśli mapa jest niestabilna, zainicjuj ją z konstruktorem, aby upewnić się, że jest zawsze albonull
w stanie końcowym, nigdy w połowie wypełniona.Możesz korzystać z płynnego API w Eclipse Collections :
Oto blog zawierający więcej szczegółów i przykładów.
Uwaga: jestem promotorem Eclipse Collections.
źródło
Miałem podobny wymóg jakiś czas temu. To nie ma nic wspólnego z guawą, ale możesz zrobić coś takiego, aby móc czysto skonstruować
Map
używając płynnego budowniczego.Utwórz klasę bazową, która rozszerza Map.
Następnie stwórz płynnego kreatora za pomocą metod, które odpowiadają Twoim potrzebom:
Następnie możesz to zaimplementować w następujący sposób:
źródło
To jest coś, czego zawsze chciałem, szczególnie podczas konfigurowania urządzeń testowych. W końcu zdecydowałem się napisać własnego, prostego, płynnego konstruktora, który mógłby zbudować dowolną implementację mapy - https://gist.github.com/samshu/b471f5a2925fa9d9b718795d8bbdfe42#file-mapbuilder-java
źródło
Oto jeden, który napisałem
Używasz tego w ten sposób:
źródło
Korzystanie z java 8:
To jest podejście Java-9
Map.ofEntries(Map.entry(k1,v1), Map.entry(k2,v2), ...)
Jak używać:
źródło
Jest
ImmutableMap.builder()
w guawie.źródło
Underscore-java może budować hashmap.
źródło