Inicializujte HashMap v prostredí Java

1. Prehľad

V tomto výučbe sa dozvieme o rôznych spôsoboch inicializácie a HashMap v Jave.

Použijeme Java 8 aj Java 9.

2. Inicializátor statiky pre statiku HashMap

Môžeme inicializovať a HashMap pomocou a statický blok kódu:

verejný statický Mapový článokMapOne; static {articleMapOne = nový HashMap (); articleMapOne.put ("ar01", "Úvod do mapy"); articleMapOne.put ("ar02", "Niektorý článok"); }

Výhodou tohto druhu inicializácie je, že mapa je premenlivá, ale bude fungovať iba pri statickej. Následne je možné podľa potreby pridávať a odstraňovať položky.

Poďme do toho a otestujme to:

@Test public void givenStaticMap_whenUpdated_thenCorrect () {MapInitializer.articleMapOne.put ("NewArticle1", "Previesť pole na zoznam"); assertEquals (MapInitializer.articleMapOne.get ("NewArticle1"), "Konvertovať pole na zoznam"); }

Mapu môžeme tiež inicializovať pomocou syntaxe dvojitých zátvoriek:

Mapa doubleBraceMap = nový HashMap () {{put ("key1", "value1"); put ("kľúč2", "hodnota2"); }};

Poznač si to musíme sa pokúsiť vyhnúť sa tejto inicializačnej technike, pretože pri každom použití vytvára anonymnú triedu navyše, obsahuje skryté odkazy na ohraničujúci objekt, a mohli by spôsobiť problémy s únikom pamäte.

3. Používanie zbierok Java

Ak potrebujeme vytvoriť singletonovú nemennú mapu s jediným záznamom, Collections.singletonMap () sa stáva veľmi užitočným:

verejná statická mapa createSingletonMap () {návrat Collections.singletonMap ("používateľské meno1", "heslo1"); }

Upozorňujeme, že táto mapa je nemenná, a ak sa pokúsime pridať ďalšie položky, hodí sa java.lang.UnsupportedOperationException.

Nemennú prázdnu mapu môžeme vytvoriť aj pomocou Collections.emptyMap ():

Mapa emptyMap = Collections.emptyMap ();

4. Java 8 Way

V tejto časti sa pozrime na spôsoby inicializácie mapy pomocou Java 8 Stream API.

4.1. Použitím Collectors.toMap ()

Použime a Prúd dvojrozmerného String zoskupiť a zhromaždiť ich do mapy:

Map map = Stream.of (new String [] [] {{"Hello", "World"}, {"John", "Doe"},}). Collect (Collectors.toMap (data -> data [0] , data -> data [1]));

Všimnite si tu dátový typ kľúča a hodnotu Mapa je rovnaký.

Aby to bolo všeobecnejšie, vezmime si pole Predmety a vykonať rovnakú operáciu:

 Mapa mapy = Stream.of (nový objekt [] [] {{"data1", 1}, {"data2", 2},}). Zhromažďovať (Collectors.toMap (data -> (reťazec) údaje [0], data -> (Integer) data [1]));

Vo výsledku vytvoríme mapu kľúča ako a String a hodnotu ako Celé číslo.

4.2. Používanie prúdu Mapa. ​​Vstup

Tu použijeme inštancie Mapa. ​​Vstup. Toto je ďalší prístup, kde máme rôzne typy kľúčov a hodnôt.

Najprv použijeme SimpleEntry implementácia Vstup rozhranie:

Mapa mapy = Stream.of (nový AbstractMap.SimpleEntry ("nápad", 1), nový AbstractMap.SimpleEntry ("mobilný", 2)) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue));

Teraz vytvorme mapu pomocou SimpleImmutableEntry implementácia:

Mapa mapy = Stream.of (nový AbstractMap.SimpleImmutableEntry ("nápad", 1), nový AbstractMap.SimpleImmutableEntry ("mobilný", 2)) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue));

4.3. Inicializuje sa nemenná mapa

V určitých prípadoch použitia musíme inicializovať nemennú mapu. To by sa dalo urobiť zabalením Collectors.toMap () vo vnútri Collectors.collectingAndThen ():

Mapa mapy = Stream.of (nový reťazec [] [] {{"Hello", "World"}, {"John", "Doe"},}). Collect (Collectors.collectingAndThen (Collectors.toMap (data -> data [0], data -> data [1]), Collections :: unmodifiableMap));

Upozorňujeme, že by sme sa mali vyhnúť použitiu takejto inicializácie pomocou Prúdy, pretože by to mohlo spôsobiť obrovský režijný výkon a veľa odpadkových objektov sa vytvára len na inicializáciu mapy.

5. Java 9 Way

Java 9 prichádza s rôznymi továrenskými metódami v Mapa rozhranie, ktoré zjednodušuje vytváranie a inicializáciu nemenných máp.

Poďme ďalej a pozrime sa na tieto továrenské metódy.

5.1. Mapa. ​​()

Táto továrenská metóda nevyžaduje žiadny argument, jediný argument a premenné argumenty:

Mapa emptyMap = Map.of (); Map singletonMap = Map.of ("key1", "value"); Map map = Map.of ("key1", "value1", "key2", "value2");

Upozorňujeme, že táto metóda podporuje iba maximálne 10 párov kľúč - hodnota.

5.2. Map.ofEntries ()

Je to podobné ako s Mapa. ​​() ale nemá žiadne obmedzenia týkajúce sa počtu párov kľúč - hodnota:

Map map = Map.ofEntries (new AbstractMap.SimpleEntry ("name", "John"), new AbstractMap.SimpleEntry ("city", "budapest"), new AbstractMap.SimpleEntry ("zip", "000000"), new AbstractMap.SimpleEntry ("home", "1231231231"));

Pamätajte, že továrenské metódy vytvárajú nemenné mapy, a preto akákoľvek mutácia spôsobí a UnsupportedOperationException.

Tiež neumožňujú nulové kľúče alebo duplikáty kľúčov.

Ak teraz po inicializácii potrebujeme premenlivú alebo rastúcu mapu, môžeme vytvoriť ľubovoľnú implementáciu súboru Mapa rozhranie a odovzdať tieto nemenné mapy v konštruktore:

Mapa mapa = nový HashMap (Map.of ("kľúč1", "hodnota1", "kľúč2", "hodnota2")); Mapa map2 = nová HashMap (Map.ofEntries (nová AbstractMap.SimpleEntry ("meno", "John"), nová AbstractMap.SimpleEntry ("mesto", "budapešť")));

6. Používanie Guavy

Keď sme sa pozreli na spôsoby použitia základnej Javy, posuňme sa ďalej a inicializujme mapu pomocou knižnice Guava:

Články na mape = ImmutableMap.of („Názov“, „Môj nový článok“, „Názov2“, „Druhý článok“);

Vytvorilo by to nemennú mapu a zmeniteľnú:

Map articles = Maps.newHashMap (ImmutableMap.of ("Názov", "Môj nový článok", "Názov2", "Druhý článok"));

Metóda ImmutableMap.of () má tiež preťažené verzie, ktoré môžu trvať až 5 párov parametrov kľúč - hodnota. Takto by vyzeral príklad s 2 pármi parametrov:

ImmutableMap.of ("kľúč1", "hodnota1", "kľúč2", "hodnota2");

7. Záver

V tomto článku sme skúmali rôzne spôsoby inicializácie a Mapa, najmä na vytváranie prázdnych, samostatných, nemenných a premenlivých máp. Ako vidíme, od verzie Java 9 došlo v tejto oblasti k obrovskému zlepšeniu.

Vzorový zdrojový kód sa ako vždy nachádza v projekte Github. Tu sa nachádzajú príklady Java 9 a tu vzorka Guava.


$config[zx-auto] not found$config[zx-overlay] not found