Java - kombinujte viac zbierok

1. Prehľad

V tomto tutoriáli si ukážeme, ako spojiť viac kolekcií do jednej logickej kolekcie.

Budeme skúmať päť rôznych prístupov - dva používajúce jazyk Java 8, jeden používajúci Guava, jeden používajúci kolekcie Apache Commons a jeden používajúci iba štandardnú sadu Java 7 SDK.

V nasledujúcich príkladoch zvážme nasledujúce kolekcie:

Zbierka collectionA = Arrays.asList ("S", "T"); Zbierka collectionB = Arrays.asList ("U", "V");

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

The Prúd rozhranie v rozhraní Java API poskytuje užitočné metódy, ktoré uľahčujú spracovanie zbierok. Pozrime sa na dve z jeho metód - concat () a flatMap () - ktoré sa používajú na kombinovanie zbierok.

Akonáhle získate a Prúd, môžete na ňom vykonávať agregované operácie.

2.1. Pomocou concat () Metóda

Statická metóda concat () kombinuje dva Prúdy logicky vytvorením lenivo zreťazeného Prúd ktorého prvky sú všetky prvky prvého Prúd po ktorom nasledujú všetky prvky druhého Prúd.

V nasledujúcom príklade to skombinujme zbierkaA a zbierka B. pomocou concat () metóda:

Stream kombinovanýStream = Stream.concat (collectionA.stream (), collectionB.stream ());

Ak potrebujete kombinovať viac ako dve Prúdy, môžete vyvolať concat () znova z pôvodného vyvolania:

Stream kombinovanýStream = Stream.concat (Stream.concat (collectionA.stream (), collectionB.stream ()), collectionC.stream ());

Je dôležité si uvedomiť, že Java 8 Prúdy nie sú opakovane použiteľné, takže by ste to mali brať do úvahy pri ich priraďovaní k premenným.

2.2. Pomocou flatMap () Metóda

The flatMap () metóda vracia a Prúd po nahradení každého z nich Prúd s obsahom zmapovaného Prúd ktorý sa vytvorí uplatnením poskytnutej mapovacej funkcie na každý prvok.

Nasledujúci príklad demonštruje zlúčenie kolekcií pomocou súboru flatMap () metóda. Spočiatku získate a Prúd ktorých prvkami sú dve zbierky, a potom zlúčite Prúd pred zhromaždením do zlúčeného zoznamu:

Stream kombinovanýStream = Stream.of (collectionA, collectionB) .flatMap (Collection :: stream); Zbierka collectionCombined = combinedStream.collect (Collectors.toList ());

3. Používanie guavy

Knižnica Guava od spoločnosti Google poskytuje niekoľko pohodlných metód na prácu so zbierkami a je možné ju použiť v prostredí Java 6 alebo novšom.

3.1. Pomocou Iterables.concat () Metóda

The Iterables.concat () metóda je jednou z pohodlných metód Guava, ktorá sa používa na zlúčenie zbierok:

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

The Iterable ktorý je vrátený, je možné previesť do zbierky:

Zbierka collectionCombined = Lists.newArrayList (combinedIterables);

3.2. Maven závislosť

Pridajte do svojho Mavenu nasledujúcu závislosť pom.xml súbor, ktorý do vášho projektu zahrnie knižnicu Guava:

 com.google.guava guava 20.0 

Najnovšiu verziu knižnice Guava nájdete v centrálnom úložisku Maven.

4. Používanie zbierok Apache Commons

Apache Commons Collections je ďalšou knižnicou nástrojov, ktoré pomáhajú pri práci s rôznymi zbierkami. Knižnica poskytuje dve užitočné metódy, ktoré možno použiť na kombinovanie zbierok. V tejto časti pochopíme, ako tieto metódy fungujú.

4.1. Pomocou IterableUtils.chainedIterable () Metóda

The IterableUtils triedy poskytuje úžitkové metódy a dekoratéry pre Iterable inštancie. Poskytuje chainedIterable () metóda, ktorú je možné kombinovať do viacerých Iterables do jedného.

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

4.2. Pomocou CollectionUtils.union () Metóda

Úžitkové metódy a dekoratéri pre Zbierka prípady poskytuje CollectionUtils trieda. The odbor () metóda z tejto triedy vráti a Zbierka obsahujúci spojenie daného Iterable inštancie.

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

V prípade odbor () metóda, mohutnosť každého prvku vo vrátenej kolekcii sa bude rovnať maximu mohutnosti tohto prvku v dvoch uvedených Iterables. To znamená, že kombinovaná kolekcia pozostáva iba z prvkov v prvej kolekcii a prvkov v druhej kolekcii, ktoré neboli prítomné v prvej kolekcii.

4.3. Maven závislosť

Pridajte do svojho Mavenu nasledujúcu závislosť pom.xml súbor, ktorý do vášho projektu zahrnie knižnicu Apache Commons Collections:

 org.apache.commons commons-collections4 4.1 

Najnovšiu verziu knižnice Apache Commons nájdete v centrálnom úložisku Maven.

5. Používanie Java 7

Ak stále používate Java 7 a chcete sa vyhnúť knižniciam tretích strán, ako je Guava, môžete použiť pridať všetko() metóda na kombinovanie prvkov z viacerých kolekcií, alebo môžete kombinovať svoje vlastné metódy na obsluhu Iterables.

5.1. Pomocou pridať všetko() Metóda

Najjednoduchším riešením kombinácie kolekcií je samozrejme použitie pridať všetko() spôsobom, ako je uvedené v nasledujúcom Zoznam Napríklad je potrebné poznamenať, že táto metóda vytvorí novú kolekciu s ďalšími odkazmi na rovnaké objekty, ktoré sú v prvých dvoch kolekciách:

Zoznam listC = nový ArrayList (); listC.addAll (listA); listC.addAll (listB);

5.2. Písanie zvyku concat () Metóda

Nasledujúci príklad definuje a concat () metóda, ktorá akceptuje dve Iterables a vráti zlúčené Iterable objekt:

public static Iterable concat (Iterable i1, Iterable i2) {return new Iterable () {public Iterator iterator () {return new Iterator () {Iterator listIterator = i1.iterator (); Boolean checkedHasNext; E nextValue; private boolean startTheSecond; void theNext () {if (listIterator.hasNext ()) {checkedHasNext = true; nextValue = listIterator.next (); } else if (startTheSecond) checkedHasNext = false; else {startTheSecond = true; listIterator = i2.iterator (); ďalší(); }} public boolean hasNext () {if (checkedHasNext == null) theNext (); návrat zaškrtnutýHasNext; } public E next () {if (! hasNext ()) throw new NoSuchElementException (); checkedHasNext = null; návrat nextValue; } public void remove () {listIterator.remove (); }}; }}; }

The concat () metódu je možné vyvolať odovzdaním dvoch kolekcií ako jej argumentov:

Iterable combineIterables = concat (collectionA, collectionB); Collection collectionCombined = makeListFromIterable (combinedIterables);

Ak potrebujete Iterable byť k dispozícii ako Zoznam, môžete tiež použiť makeListFromIterable () metóda, ktorá vytvára a Zoznam pomocou členov Iterable:

public static List makeListFromIterable (Iterable iter) {List list = new ArrayList (); pre (položka E: iter) {list.add (položka); } návratový zoznam; }

6. Záver

V článku sa diskutovalo o niekoľkých rôznych spôsoboch logickej kombinácie dvoch kolekcií v prostredí Java bez vytvárania ďalších odkazov na objekty, ktoré obsahujú.

Kód tohto tutoriálu je k dispozícii na Github.


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