Chciałbym utworzyć nowy element, który podobnie jak Util.Map.Entry
który będzie zawierał strukturę key
, value
.
Problem polega na tym, że nie mogę utworzyć instancji, Map.Entry
ponieważ jest to interfejs.
Czy ktoś wie, jak utworzyć nowy ogólny obiekt klucz / wartość dla Map.Entry?
java
dictionary
collections
key-value
Człowiek Pająk
źródło
źródło
Jest
public static class AbstractMap.SimpleEntry<K,V>
. Nie daj sięAbstract
zwieść części nazwy: w rzeczywistości NIE jest toabstract
klasa (ale jej najwyższy poziomAbstractMap
to).Fakt, że jest to
static
klasa zagnieżdżona, oznacza, że NIE potrzebujesz otaczającejAbstractMap
instancji, aby utworzyć jej instancję, więc coś takiego wygląda dobrze:Jak zauważono w innej odpowiedzi, Guava ma również wygodną
static
metodę fabrycznąMaps.immutableEntry
, z której można skorzystać.Powiedziałeś:
To nie do końca dokładne. Powodem, dla którego nie można utworzyć go bezpośrednio (tj. Za pomocą
new
) jest to, że jest to plikinterface Map.Entry
.Zastrzeżenie i wskazówka
Jak zauważono w dokumentacji,
AbstractMap.SimpleEntry
jest@since 1.6
, więc jeśli utkniesz do 5,0, to nie jest dostępne.Aby poszukać innej znanej klasy
implements Map.Entry
, możesz przejść bezpośrednio do javadoc. Z wersji Java 6Niestety wersja 1.5 nie zawiera żadnej znanej klasy implementacyjnej, której możesz użyć, więc być może utknąłeś przy implementacji własnej.
źródło
AbstractMap.SimpleEntry
nie było publiczne aż do Java 6, jak widać w dokumentacji.AbstractMap.SimpleEntry
. Chyba uczysz się czegoś nowego każdego dnia!Począwszy od Java 9, pojawiła się nowa metoda narzędziowa, która pozwala stworzyć niezmienny wpis, którym jest
Map#entry(Object, Object)
.Oto prosty przykład:
Jak to jest niezmienne, wołanie
setValue
rzuci anUnsupportedOperationException
. Inne ograniczenia polegają na tym, że nie można go przekształcić donull
postaci szeregowej, a ponieważ klucz lub wartość są zabronione, jeśli nie jest to dla Ciebie do przyjęcia, musisz użyćAbstractMap.SimpleImmutableEntry
lubAbstractMap.SimpleEntry
zamiast tego.Uwaga: jeśli potrzebujesz bezpośrednio utworzyć
Map
od 0 do 10 par (klucz, wartość), możesz zamiast tego użyć metod pisaniaMap.of(K key1, V value1, ...)
.źródło
Spróbuj Maps.immutableEntry z Guava
Ma to tę zaletę, że jest kompatybilny z Javą 5 (w przeciwieństwie do
AbstractMap.SimpleEntry
wymaganej Java 6.)źródło
Przykład AbstractMap.SimpleEntry:
Utwórz wystąpienie:
Dodaj wiersze:
Pobierz wiersze:
Powinien wydrukować:
Jest dobry do definiowania krawędzi struktur graficznych. Jak te między neuronami w twojej głowie.
źródło
Możesz faktycznie użyć:
Map.Entry<String, String> en= Maps.immutableEntry(key, value);
źródło
Dlaczego
Map.Entry
? Myślę, że coś w rodzaju pary klucz-wartość pasuje do tego przypadku.Posługiwać się
java.util.AbstractMap.SimpleImmutableEntry
lubjava.util.AbstractMap.SimpleEntry
źródło
org.apache.commons.lang3.tuple.Pair
narzędziajava.util.Map.Entry
i może być również używany samodzielnie.Podobnie jak inni wspominali o Guava
com.google.common.collect.Maps.immutableEntry(K, V)
robi lewę.Wolę
Pair
ze względu na płynnąPair.of(L, R)
składnię.źródło
ImmutablePair
zamiast tego mogę zasugerować ?Zdefiniowałem ogólną klasę Pair, z której cały czas korzystam. Wspaniale. Jako bonus, definiując statyczną metodę fabryczną (Pair.create), muszę tylko pisać argumenty typu o połowę częściej.
źródło
Pair
wdrożenia są złe. ŹródłoJeśli używasz Clojure, masz inną opcję:
źródło