Java 8 Collectors toMap

1. Úvod

V tomto rýchlom výučbe si povieme niečo o mapovať() metóda Zberatelia trieda. Použijeme to na zber Prúds do a Mapa inštancia.

Pri všetkých príkladoch, ktoré sú tu uvedené, použijeme ako východisko zoznam kníh a transformujeme ich na rôzne Mapa implementácie.

2. Zoznam do Mapa

Začneme najjednoduchším prípadom transformáciou a Zoznam do a Mapa.

Náš Kniha trieda je definovaná ako:

trieda Kniha {private String name; súkromné ​​int vydanieRok; súkromný reťazec isbn; // zakladatelia a zakladatelia}

Vytvoríme zoznam kníh na overenie nášho kódu:

Zoznam bookList = nový ArrayList (); bookList.add (nová kniha ("Spoločenstvo prsteňa", 1954, "0395489318")); bookList.add (nová kniha ("Dve veže", 1954, "0345339711")); bookList.add (nová kniha („Návrat kráľa“, 1955, „0618129111“)));

Pre tento scenár použijeme nasledujúce preťaženie mapovať() metóda:

Zberateľ toMap (Function keyMapper, Function valueMapper)

S mapovať, môžeme naznačiť stratégie, ako získať kľúč a hodnotu pre mapu:

verejná mapa listToMap (Zoznam kníh) {return books.stream (). collect (Collectors.toMap (Book :: getIsbn, Book :: getName)); }

Môžeme ho ľahko overiť pomocou:

@Test public void whenConvertFromListToMap () {assertTrue (convertToMap.listToMap (bookList) .size () == 3); }

3. Riešenie kľúčových konfliktov

Vyššie uvedený príklad fungoval dobre, ale čo by sa stalo, keby existoval duplicitný kľúč?

Poďme si predstaviť, že sme kľúčovali my Mapa každým KnihaRok vydania:

public Map listToMapWithDupKeyError (Zoznam kníh) {return books.stream (). collect (Collectors.toMap (Book :: getReleaseYear, Function.identity ())); }

Vzhľadom na náš predchádzajúci zoznam kníh by sme videli IllegalStateException:

@Test (očakáva sa = IllegalStateException.class) public void whenMapHasDuplicateKey_without_merge_function_then_runtime_exception () {convertToMap.listToMapWithDupKeyError (bookList); }

Aby sme to vyriešili, musíme použiť inú metódu s ďalším parametrom, mergeFunction:

Collector toMap (Function keyMapper, Function valueMapper, BinaryOperator mergeFunction) 

Poďme predstaviť funkciu zlúčenia, ktorá naznačuje, že v prípade kolízie ponecháme existujúci záznam:

verejná mapa listToMapWithDupKey (Zoznam kníh) {return books.stream (). collect (Collectors.toMap (Book :: getReleaseYear, Function.identity (), (existujúce, náhradné) -> existujúce)); }

Alebo inými slovami, dostaneme správanie založené na prvom víťazstve:

@Test public void whenMapHasDuplicateKeyThenMergeFunctionHandlesCollision () {Map booksByYear = convertToMap.listToMapWithDupKey (bookList); assertEquals (2, booksByYear.size ()); assertEquals ("0395489318", booksByYear.get (1954) .getIsbn ()); }

4. Ďalšie typy máp

Štandardne a mapovať() metóda vráti a HashMap.

Môžeme sa však vrátiť inak Mapa implementácie? Odpoveď je áno:

Collector toMap (Function keyMapper, Function valueMapper, BinaryOperator mergeFunction, Supplier mapSupplier)

Kde mapový dodávateľ je funkcia, ktorá vracia nové, prázdne Mapa s výsledkami.

4.1. Zoznam do ConcurrentMap

Zoberme si rovnaký príklad ako vyššie a pridajme a mapový dodávateľ funkcia vrátiť a ConcurrentHashMap:

verejná mapa listToConcurrentMap (Zoznam kníh) {return books.stream (). collect (Collectors.toMap (Book :: getReleaseYear, Function.identity (), (o1, o2) -> o1, ConcurrentHashMap :: new)); }

Poďme ďalej a otestujme náš kód:

@Test public void whenCreateConcurrentHashMap () {assertTrue (convertToMap.listToConcurrentMap (bookList) instanceof ConcurrentHashMap); }
4.2. Zoradené Mapa

Na záver sa pozrime, ako vrátiť zoradenú mapu. Na to použijeme a TreeMap ako mapový dodávateľ parameter.

Pretože a TreeMap je štandardne triedený podľa prirodzeného usporiadania svojich kľúčov, nemusíme ho explicitne triediť kníh sami:

verejná TreeMap listToSortedMap (Zoznam kníh) {return books.stream () .collect (Collectors.toMap (Book :: getName, Function.identity (), (o1, o2) -> o1, TreeMap :: new)); }

Takže v našom prípade sa vrátil TreeMap budú zoradené v abecednom poradí podľa názvu knihy:

@Test public void whenMapisSorted () {assertTrue (convertToMap.listToSortedMap (bookList) .firstKey (). Equals ("Spoločenstvo prsteňa")); }
5. Záver

V tomto článku sme sa pozreli na mapovať() metóda Zberatelia trieda. Umožňuje nám vytvárať nové Mapa od a Prúd. Naučili sme sa tiež, ako vyriešiť kľúčové konflikty a vytvoriť rôzne implementácie máp.

Ako vždy je kód k dispozícii na GitHub.


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