Java - kombinirajte više kolekcija

1. Pregled

U ovom uputstvu ilustrirat ćemo kako povezati više zbirki u jednu logičku zbirku.

Istražit ćemo pet različitih pristupa - dva koji koriste Java 8, jedan Guava, jedan Apache Commons Collections i jedan koji koristi samo standardni Java 7 SDK.

U primjerima koji slijede, razmotrimo sljedeće zbirke:

Zbirka zbirkeA = Arrays.asList ("S", "T"); Zbirka kolekcijeB = Arrays.asList ("U", "V");

2. Korištenje Jave 8 Stream API

The Stream sučelje u Java API-ju pruža korisne metode koje olakšavaju obradu zbirki. Pogledajmo dvije njegove metode - concat () i flatMap () - koji se koriste za kombiniranje kolekcija.

Jednom kada dobijete Stream, na njemu možete izvoditi skupne operacije.

2.1. Koristiti concat () Metoda

Statička metoda concat () kombinira dva Potoci logično stvaranjem lijeno spojene Stream čiji su elementi svi elementi prvog Stream nakon čega slijede svi elementi drugog Stream.

U primjeru ispod, kombinirajmo zbirkaA i kolekcijaB koristiti concat () metoda:

Stream kombiniraniStream = Stream.concat (collectionA.stream (), collectionB.stream ());

Ako trebate kombinirati više od dva Potoci, možete se pozvati na concat () metoda ponovno iz izvornog poziva:

Tok kombiniraniStream = Stream.concat (Stream.concat (collectionA.stream (), collectionB.stream ()), collectionC.stream ());

Važno je napomenuti da Java 8 Potoci nisu za ponovnu uporabu, pa biste to trebali uzeti u obzir prilikom njihovog dodjeljivanja varijablama.

2.2. Koristiti flatMap () Metoda

The flatMap () metoda vraća a Stream nakon zamjene svakog elementa ovoga Stream sa sadržajem preslikane Stream koji se proizvodi primjenom osigurane funkcije mapiranja na svaki element.

Primjer u nastavku prikazuje spajanje zbirki pomoću flatMap () metoda. U početku dobivate Stream čiji su elementi dvije zbirke, a zatim poravnate Stream prije nego što ga sakupite na spojeni popis:

Stream kombiniraniStream = Stream.of (collectionA, collectionB) .flatMap (Collection :: stream); Kolekcija kolekcijeCombined = kombiniraniStream.collect (Collectors.toList ());

3. Korištenje Guave

Googleova knjižnica Guava nudi nekoliko praktičnih metoda za rad sa zbirkama i može se koristiti s Javom 6 ili novijom.

3.1. Koristiti Iterables.concat () Metoda

The Iterables.concat () metoda jedna je od Guava prikladnih metoda koja se koristi za spajanje zbirki:

Iterable combIterables = Iterables.unmodifiableIterable (Iterables.concat (collectionA, collectionA));

The Iterativ koji se vrati može se pretvoriti u zbirku:

Zbirka zbirkeCombined = Lists.newArrayList (kombiniraniIterables);

3.2. Ovisnost Mavena

Dodajte sljedeću ovisnost na svoj Maven pom.xml datoteka koja uključuje Guava knjižnicu u vaš projekt:

 com.google.guava guava 20.0 

Najnoviju verziju biblioteke Guava možete pronaći u spremištu Maven Central.

4. Korištenje zbirki Apache Commons

Apache Commons Collections još je jedna biblioteka uslužnih programa koja pomažu u radu s različitim zbirkama. Biblioteka nudi dvije korisne metode koje se mogu koristiti za kombiniranje zbirki. U ovom ćemo odjeljku razumjeti kako funkcioniraju ove metode.

4.1. Koristiti IterableUtils.chainedIterable () Metoda

The IterableUtils klasa pruža korisne metode i dekoratere za Iterativ instance. Pruža chainedIterable () metoda koja se može koristiti za kombiniranje višestrukih Iterativs u jednu.

Iterable combIterables = IterableUtils.chainedIterable (collectionA, collectionB);

4.2. Koristiti CollectionUtils.union () Metoda

Korisne metode i dekoratori za Kolekcija slučajeve pruža CollectionUtils razred. The unija() metoda iz ove klase vraća a Kolekcija koji sadrže sjedinjenje datog Iterativ instance.

Iterable kombiniraniIterables = CollectionUtils.union (collectionA, collectionB);

U slučaju unija() metoda, kardinalnost svakog elementa u vraćenoj zbirci bit će jednaka maksimumu kardinalnosti tog elementa u dva dana Interables. To znači da se kombinirana zbirka sastoji samo od elemenata prve zbirke i elemenata druge zbirke koji nisu bili prisutni u prvoj.

4.3. Ovisnost Mavena

Dodajte sljedeću ovisnost na svoj Maven pom.xml datoteka koja u vaš projekt uključuje biblioteku Apache Commons Collections:

 org.apache.commons commons-collection4 4.1 

Najnoviju verziju biblioteke Apache Commons možete pronaći u spremištu Maven Central.

5. Korištenje Jave 7

Ako i dalje koristite Javu 7 i želite izbjeći biblioteke trećih strana poput Guave, možete koristiti Dodaj Sve() metodu za kombiniranje elemenata iz više zbirki ili možete napisati vlastite korisne metode za kombiniranje Interables.

5.1. Koristiti Dodaj Sve() Metoda

Naravno, najjednostavnije rješenje za kombiniranje kolekcija je korištenje Dodaj Sve() metoda, kao u nastavku Popis na primjer, vrijedi napomenuti da ova metoda stvara novu zbirku s dodatnim referencama na iste objekte koji su u prve dvije zbirke:

Popis popisC = novi ArrayList (); listC.addAll (listA); listC.addAll (popisB);

5.2. Pisanje običaja concat () Metoda

Sljedeći primjer definira a concat () metoda koja prihvaća dva Interables i vraća spojeni Iterativ objekt:

javni statički Iterable concat (Iterable i1, Iterable i2) {return new Iterable () {public Iterator iterator () {return new Iterator () {Iterator listIterator = i1.iterator (); Logička provjerenoHasNext; E sljedeća vrijednost; privatni logički startTheSecond; poništi theNext () {if (listIterator.hasNext ()) {checkedHasNext = true; nextValue = listIterator.next (); } inače ako je (startTheSecond) checkedHasNext = false; else {startTheSecond = true; listIterator = i2.iterator (); sljedeći(); }} javni boolean hasNext () {if (checkHasNext == null) theNext (); povratak checkHasNext; } public E next () {if (! hasNext ()) throw new NoSuchElementException (); checkHasNext = null; return nextValue; } javna praznina remove () {listIterator.remove (); }}; }}; }

The concat () metoda može se pozvati prosljeđivanjem dviju zbirki kao svojih argumenata:

Iterable combIterables = concat (collectionA, collectionB); Kolekcija kolekcijeCombined = makeListFromIterable (kombiniraniIterables);

Ako trebate Iterativ biti dostupan kao a Popis, također možete koristiti makeListFromIterable () metoda koja stvara a Popis koristeći članove Iterativ:

javni statički Popis makeListFromIterable (Iterable iter) {Popis popisa = novi ArrayList (); za (E stavka: iter) {list.add (stavka); } popis za povratak; }

6. Zaključak

U članku se raspravljalo o nekoliko različitih načina za logično kombiniranje dviju zbirki u Javi bez stvaranja dodatnih referenci na objekte koje sadrže.

Kôd ovog vodiča dostupan je na Githubu.