Kombiniranje različitih vrsta kolekcija u Javi

1. Uvod

U ovom brzom vodiču istražit ćemo različite načine kombiniranja zbirki u Javi.

Istražit ćemo razne pristupe koristeći Javu i vanjske okvire poput Guave, Apachea itd. Za uvod u Zbirke pogledajte ovu seriju ovdje.

2. Vanjske knjižnice za rad s zbirkama

Zajedno s izvornim pristupima, koristit ćemo i vanjske knjižnice. Molimo dodajte sljedeće ovisnosti u pom.xml:

 org.apache.commons commons-collection4 4.2 org.apache.commons commons-exec 1.3 com.google.guava guava 26.0-jre 

Najnovije verzije mogu se naći na Maven Central za Commons, Commons-exec i Guava.

3. Kombiniranje nizova u Javi

3.1. Izvorno Java rješenje

Java dolazi s ugrađenim void arraycopy () metoda koja kopira zadani izvorni niz u odredišni.

Možemo ga koristiti na sljedeći način:

Objekt [] kombinirano = novi objekt [prva.duljina + druga.duljina]; System.arraycopy (prva, 0, kombinirana, 0, prva.duljina); System.arraycopy (druga, 0, kombinirana, prva.duljina, druga.duljina);

U ovoj metodi, zajedno s objektima niza, također određujemo položaj odakle trebamo kopirati, a također prosljeđujemo parametar length.

Ovo je izvorno Java rješenje, pa ne zahtijeva vanjske knjižnice.

3.2. Korištenje Jave 8 Stream API

Potoci nude učinkovit način ponavljanja nekoliko različitih vrsta zbirki. Da biste započeli s streamovima, prijeđite na Java 8 Stream API Tutorial.

Za kombiniranje nizova pomoću a Stream, možemo koristiti ovaj kod:

Objekt [] kombinirano = Stream.concat (Arrays.stream (prvi), Arrays.stream (drugi)). ToArray ();

Stream.concat () stvara spojeni tok u kojem su elementi prvog toka praćeni elementima drugog toka, koji je nakon toga pretvoren u niz pomoću toArray () metoda.

Proces stvaranja streama jednak je za različite vrste zbirki. Međutim, možemo ga prikupiti na različite načine da bismo iz njega preuzeli različite strukture podataka.

Ponovno ćemo posjetiti ovu metodu u odjeljcima 4.2. i 5.2. da vidimo kako možemo koristiti istu metodu na Popisi i Kompleti.

3.3. Koristeći ArrayUtils iz tvrtke Apache Commons

Apache commons knjižnica pruža nam Dodaj Sve() metoda iz ArrayUtils paket. Kao parametar možemo dostaviti polje odredišta i izvora, a ova metoda će vratiti kombinirani niz:

Objekt [] kombinirano = ArrayUtils.addAll (prvi, drugi);

O ovoj se metodi također detaljno govori u članku Obrada niza s Apache Commons Lang 3.

3.4. Korištenjem Guave

Guava nam pruža concat () metoda za istu svrhu:

Object [] kombinirano = ObjectArrays.concat (prvi, drugi, Object.class);

Može se koristiti s različitim vrstama podataka i prihvaća dva izvorna niza zajedno s literalom klase za vraćanje kombiniranog polja.

4. Kombiniranje Popis na Javi

4.1. Koristeći Kolekcija Native Dodaj Sve() Metoda

The Kolekcija samo sučelje nam pruža Dodaj Sve() metoda, koja dodaje sve elemente u navedenoj zbirci u objekt pozivatelja. O tome se također detaljno raspravlja u ovom članku iz Baeldunga:

Popis kombinirano = novi ArrayList (); kombinirano.addAll (prvo); kombinirano.addAll (drugo);

Budući da je ova metoda osigurana u nadređenom sučelju okvira Collections, tj. Kolekcija sučelje, može se primijeniti na sve Popiss i Postavis.

4.2. Korištenje Jave 8

Možemo koristiti Stream i Kolekcionari na sljedeći način kombinirati Popisi:

Kombinirani popis = Stream.concat (first.stream (), second.stream ()). Collect (Collectors.toList ());

To je isto kao i ono što smo učinili u slučaju Nizovi u odjeljku 3.2, ali umjesto da ga pretvorimo u niz, koristili smo kolektore da bismo ga pretvorili u popis. Da biste saznali više o Kolekcionari detaljno posjetite Vodič za kolekcionare Jave 8.

Možemo i koristiti flatMaps na ovaj način:

Kombinirani popis = Stream.of (prvi, drugi) .flatMap (Collection :: stream) .collect (Collectors.toList ());

Prvo, koristimo Stream.of () koji vraća sekvencijalni tok dva popisa - prvi i drugi. Tada ćemo ga proslijediti flatMap koji će vratiti sadržaj mapiranog toka nakon primjene funkcije mapiranja. O ovoj se metodi govori i u članku Spajanje tokova u Javi.

Da biste saznali više o flatMap, prijeđite na ovaj članak iz Baeldunga.

4.3. Koristeći ListUtils iz tvrtke Apache Commons

CollectionUtils.union vrši spajanje dviju zbirki i vraća zbirku koja sadrži sve elemente:

Popis kombinirano = ListUtils.union (prvi, drugi);

O ovoj se metodi govori i u Vodiču za zbirke Apache Commons CollectionUtils. Za više informacija prijeđite na odjeljak 4.9. ovog članka.

4.4. Korištenjem Guave

Za spajanje a Popis koristeći Guavu, mi ćemo koristiti Iterativ koja se sastoji od concat () metoda. Nakon spajanja svih kolekcija, možemo brzo dobiti kombinirano Popis objekt kao što je prikazano u ovom primjeru:

Iterable combinationIterables = Iterables .unmodifiableIterable (Iterables.concat (prvi, drugi)); Popis kombinirano = Lists.newArrayList (kombiniraniIterables);

5. Kombiniranje Postavi na Javi

5.1. Jednostavno Java rješenje

Kao što smo već razgovarali u odjeljku 4.1., Sučelje za prikupljanje dolazi s ugrađenim Dodaj Sve() metoda koja se može koristiti za kopiranje Popisi i Kompleti također:

Postavi kombinirano = novi HashSet (); kombinirano.addAll (prvo); kombinirano.addAll (drugo);

5.2. Korištenje Java 8 Streamova

Ista funkcija za koju smo koristili Popis ovdje se mogu primijeniti objekti:

Postavi kombinirano = Stream .concat (first.stream (), second.stream ()) .collect (Collectors.toSet ());

Jedina značajna razlika ovdje u usporedbi s popisom je ta da umjesto korištenja Collectors.toList (), koristimo Collectors.toSet () da akumulira sve elemente iz isporučena dva toka u novi Postavi.

I slično kao Popisi, prilikom upotrebe flatMaps na Kompleti, izgledalo bi kao:

Postavi kombinirano = Stream.of (prvi, drugi) .flatMap (Collection :: stream) .collect (Collectors.toSet ());

5.3. Korištenje Apache Commons

Slično kao ListUtils, također možemo raditi s SetUtils to čini uniju Postavi elementi:

Skup kombinirano = SetUtils.union (prvi, drugi);

5.4. Koristeći se iz Guave

Knjižnica Guava pruža nam jednostavnost Sets.union () metoda za kombiniranje Kompleti na Javi:

Kombinirani set = Sets.union (prvi, drugi);

6. Kombiniranje Karta na Javi

6.1. Jednostavno Java rješenje

Možemo se poslužiti Karta sučelje koje nam samo pruža putAll () metoda koja kopira sva preslikavanja iz priloženog argumenta Karta prigovoriti pozivatelju Karta objekt:

Karta kombinirana = nova HashMap (); kombinirano.putAll (prvo); kombinirano.putAll (drugo);

6.2. Korištenje Jave 8

Od Jave 8, Karta razred se sastoji od sjediniti() metoda koja prihvaća ključ, vrijednost i BiFunction. Ovo možemo koristiti s izjavom Java 8 forEach da bismo postigli funkciju spajanja:

second.forEach ((ključ, vrijednost) -> first.merge (ključ, vrijednost, String :: concat));

Treći parametar, tj. Funkcija preslikavanja korisna je kada je isti par ključ / vrijednost prisutan na objema izvornim kartama. Ova funkcija određuje što treba učiniti s tim vrstama vrijednosti.

Možemo i koristiti flatMap kao ovo:

Kombinirana karta = Stream.of (prva, druga) .map (Map :: entrySet) .flatMap (Collection :: stream) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, String: : concat));

6.3. Korištenje Apache Commons Exec

Apache Commons Exec pruža nam jednostavan pristup spajanje (prvo karta, druga karta) metoda:

Karta kombinirana = MapUtils.merge (prva, druga);

6.4. Korištenje Google Guave

Možemo koristiti Nepromjenjiva karta pruža Googleova knjižnica Guava. To je putAll () metoda pridružuje sve zadane ključeve i vrijednosti karte ugrađenoj karti:

Karta kombinirana = ImmutableMap.builder () .putAll (prva) .putAll (druga) .build ();

7. Zaključak

U ovom smo članku prošli kroz različite pristupe kombiniranju različitih vrsta Zbirke. Spojili smo nizovi, Popisi, Kompleti, i Karte.

Kao i uvijek, cjelovite isječke koda s odgovarajućim jediničnim testovima možete pronaći na GitHubu.


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