Kombinácia rôznych typov zbierok v Jave

1. Úvod

V tomto rýchlom výučbe preskúmame rôzne spôsoby kombinovania zbierok v Jave.

Budeme skúmať rôzne prístupy využívajúce Javu a externé rámce ako Guava, Apache atď. Na úvod do zbierok sa pozrite na túto sériu tu.

2. Externé knižnice na prácu so zbierkami

Spolu s natívnymi prístupmi budeme využívať aj externé knižnice. Pridajte nasledujúce závislosti do pom.xml:

 org.apache.commons commons-collections4 4,2 org.apache.commons commons-exec 1.3 com.google.guava guava 26.0-jre 

Najnovšie verzie nájdete na serveroch Maven Central pre Commons, Commons-exec a Guava.

3. Kombinácia polí v Jave

3.1. Natívne riešenie Java

Java je vstavaná void arraycopy () metóda, ktorá skopíruje dané zdrojové pole do cieľového.

Môžeme ho použiť nasledujúcim spôsobom:

Objekt [] kombinovaný = nový objekt [first.length + second.length]; System.arraycopy (prvá, 0, kombinovaná, 0, prvá.dĺžka); System.arraycopy (druhá, 0, kombinovaná, prvá.dĺžka, druhá.dĺžka);

V tejto metóde spolu s objektmi poľa určíme aj pozíciu, odkiaľ potrebujeme kopírovať, a odovzdáme tiež parameter dĺžky.

Toto je natívne riešenie Java, takže nevyžaduje žiadne externé knižnice.

3.2. Používanie Java 8 Prúd API

Streamy ponúkajú efektívny spôsob opakovania niekoľkých rôznych typov zbierok. Ak chcete začať s prúdmi, choďte na výukový program Java 8 Stream API.

Kombinácia polí pomocou a Prúd, môžeme použiť tento kód:

Object [] kombinované = Stream.concat (Arrays.stream (prvý), Arrays.stream (druhý)). ToArray ();

Stream.concat () vytvorí zreťazený prúd, v ktorom za prvkami prvého prúdu nasledujú prvky druhého prúdu, ktorý sa potom prevedie na pole pomocou toArray () metóda.

Proces vytvárania streamu je rovnaký pre rôzne typy zbierok. Môžeme ho však zhromaždiť rôznymi spôsobmi, aby sme z neho získali rôzne dátové štruktúry.

K tejto metóde sa vrátime v sekciách 4.2. a 5.2. aby sme zistili, ako môžeme rovnakú metódu použiť na Zoznamy a Sady.

3.3. Použitím ArrayUtils od spoločnosti Apache Commons

Knižnica Apache Commons nám poskytuje pridať všetko() metóda z ArrayUtils balíček. Ako parametre môžeme dodať cieľové a zdrojové pole a táto metóda vráti kombinované pole:

Object [] combined = ArrayUtils.addAll (prvý, druhý);

Tejto metóde sa podrobne venujeme aj v článku Array Processing with Apache Commons Lang 3.

3.4. Pomocou Guava

Guava nám poskytuje: concat () metóda na ten istý účel:

Object [] kombinované = ObjectArrays.concat (prvý, druhý, Object.class);

Môže sa použiť s rôznymi dátovými typmi a na vrátenie kombinovaného poľa prijíma dve zdrojové polia spolu s literálom triedy.

4. Kombinovanie Zoznam v Jave

4.1. Použitím Zbierka Nativní pridať všetko() Metóda

The Zbierka samotné rozhranie nám poskytuje pridať všetko() metóda, ktorá do objektu volajúceho pridá všetky prvky v určenej kolekcii. Tomuto sa podrobne venuje aj tento článok o Baeldungu:

Zoznam kombinovaný = nový ArrayList (); combined.addAll (prvý); combined.addAll (druhý);

Pretože táto metóda je poskytovaná v naj rodičovskejšom rozhraní kolekčného rámca, t.j. Zbierka je možné ho použiť vo všetkých Zoznams a Nastaviťs.

4.2. Používanie Java 8

Môžeme použiť Prúd a Zberatelia nasledujúcim spôsobom kombinovať Zoznamy:

Zoznam kombinovaný = Stream.concat (first.stream (), second.stream ()). Collect (Collectors.toList ());

Je to to isté, čo sme urobili v prípade Polia v časti 3.2, ale namiesto toho, aby sme ho konvertovali na pole, použili sme kolektory na jeho prevedenie do zoznamu. Ak sa chcete dozvedieť viac o Zberatelia podrobne nájdete v Sprievodcovi zberateľmi Java 8’s.

Môžeme tiež použiť flatMaps touto cestou:

Zoznam kombinovaný = Stream.of (prvý, druhý) .flatMap (Collection :: stream) .collect (Collectors.toList ());

Najprv použijeme Stream.of () ktorý vracia postupný prúd dvoch zoznamov - najprv a druhý. Potom to odovzdáme flatMap ktorý po aplikácii mapovacej funkcie vráti obsah mapovaného streamu. Táto metóda je tiež diskutovaná v článku Zlúčenie streamov v Jave.

Ak sa chcete dozvedieť viac o flatMap, zamierte k tomuto článku v Baeldungu.

4.3. Použitím ListUtils od spoločnosti Apache Commons

CollectionUtils.union vykoná spojenie dvoch zbierok a vráti kolekciu, ktorá obsahuje všetky prvky:

Zoznam kombinovaný = ListUtils.union (prvý, druhý);

O tejto metóde pojednáva aj Sprievodca zbierkami Apache Commons CollectionUtils. Viac informácií nájdete v časti 4.9. tohto článku.

4.4. Pomocou Guava

Na zlúčenie a Zoznam pomocou Guavy použijeme Iterable ktorá sa skladá z concat () metóda. Po zreťazení všetkých zbierok môžeme rýchlo získať kombináciu Zoznam objekt, ako je znázornené v tomto príklade:

Iterable combineIterables = Iterables .unmodifiableIterable (Iterables.concat (prvý, druhý)); Zoznam kombinovaný = Lists.newArrayList (combineIterables);

5. Kombinovanie Nastaviť v Jave

5.1. Jednoduché riešenie Java

Ako sme už diskutovali v časti 4.1., Rozhranie Collection je vybavené zabudovaným rozhraním pridať všetko() metóda, ktorú je možné použiť na kopírovanie Zoznamy a Sady tiež:

Sada kombinovaná = nová HashSet (); combined.addAll (prvý); combined.addAll (druhý);

5.2. Používanie streamov Java 8

Rovnaká funkcia, ktorú sme použili Zoznam objekty je možné použiť tu:

Sada kombinovaná = Stream .concat (first.stream (), second.stream ()) .collect (Collectors.toSet ());

Jediným pozoruhodným rozdielom v porovnaní so zoznamom je, že namiesto použitia Collectors.toList (), používame Collectors.toSet () akumulovať všetky prvky z dodaných dvoch prúdov do nového Nastaviť.

A podobne ako Zoznamy, pri použití flatMaps na Sady, vyzeralo by to ako:

Sada kombinovaná = Stream.of (prvý, druhý) .flatMap (Collection :: stream) .collect (Collectors.toSet ());

5.3. Používanie Apache Commons

Podobne ako v ListUtils, môžeme tiež pracovať s SetUtils že robí spojenie Nastaviť prvky:

Sada kombinovaná = SetUtils.union (prvá, druhá);

5.4. Používanie z Guavy

Knižnica Guava nám poskytuje priame informácie Súpravy.union () metóda kombinovať Sady v Jave:

Sada kombinovaná = Sady.union (prvý, druhý);

6. Kombinovanie Mapa v Jave

6.1. Jednoduché riešenie Java

Môžeme využiť Mapa rozhranie, ktoré nám samotné poskytuje putAll () metóda, ktorá kopíruje všetky mapovania z dodaného argumentu Mapa namietať voči volajúcemu Mapa objekt:

Kombinovaná mapa = nová HashMap (); combined.putAll (prvý); combined.putAll (druhý);

6.2. Používanie Java 8

Od verzie Java 8 sa Mapa trieda sa skladá z zlúčiť() metóda, ktorá akceptuje kľúč, hodnotu a BiFunkciu. Môžeme to použiť s príkazom Java 8 forEach na dosiahnutie funkčnosti zlúčenia:

second.forEach ((kľúč, hodnota) -> first.merge (kľúč, hodnota, String :: concat));

Tretí parameter, t. J. Funkcia premapovania je užitočná, keď je v oboch zdrojových mapách rovnaký pár kľúč - hodnota. Táto funkcia určuje, čo by sa malo robiť s týmito typmi hodnôt.

Môžeme tiež použiť flatMap Páči sa ti to:

Kombinovaná mapa = Stream.of (prvý, druhý) .map (Map :: entrySet) .flatMap (Collection :: stream) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, reťazec: : concat));

6.3. Používanie Apache Commons Exec

Apache Commons Exec nám poskytuje priame informácie zlúčiť (prvá mapa, druhá mapa) metóda:

Kombinovaná mapa = MapUtils.merge (prvá, druhá);

6.4. Pomocou služby Google Guava

Môžeme použiť ImmutableMap poskytované knižnicou Guava spoločnosti Google. Je to putAll () metóda združuje všetky dané kľúče a hodnoty mapy do vytvorenej mapy:

Kombinovaná mapa = ImmutableMap.builder () .putAll (prvý) .putAll (druhý) .build ();

7. Záver

V tomto článku sme prešli rôznymi prístupmi ku kombinovaniu rôznych typov Zbierky. Zlúčili sme polia, Zoznamy, Sadya Mapy.

Kompletné úryvky kódu s ich správnymi testami jednotiek nájdete ako vždy na GitHub.


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