Java - Combineer meerdere verzamelingen

1. Overzicht

In deze tutorial laten we zien hoe je meerdere verzamelingen kunt samenvoegen tot één logische verzameling.

We zullen vijf verschillende benaderingen onderzoeken: twee met Java 8, een met Guava, een met Apache Commons Collections en een met alleen de standaard Java 7 SDK.

Laten we in de volgende voorbeelden de volgende verzamelingen bekijken:

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

2. Java 8 gebruiken Stroom API

De Stroom interface in Java API biedt handige methoden die het gemakkelijker maken om verzamelingen te verwerken. Laten we eens kijken naar twee van zijn methoden - concat () en flatMap () - die worden gebruikt voor het combineren van collecties.

Zodra u een Stroom, kunt u er geaggregeerde bewerkingen op uitvoeren.

2.1. De ... gebruiken concat () Methode

De statische methode concat () combineert twee Streams logischerwijs door een lui aaneengeschakeld Stroom waarvan de elementen alle elementen zijn van de eerste Stroom gevolgd door alle elementen van de tweede Stroom.

Laten we in het onderstaande voorbeeld combineren collectie A. en collectie B. de ... gebruiken concat () methode:

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

Als u meer dan twee moet combineren Streams, kunt u de concat () methode opnieuw vanuit de oorspronkelijke aanroep:

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

Het is belangrijk op te merken dat Java 8 Streams zijn niet herbruikbaar, dus u moet hier rekening mee houden wanneer u ze aan variabelen toewijst.

2.2. De ... gebruiken flatMap () Methode

De flatMap () methode retourneert een Stroom na vervanging van elk element hiervan Stroom met de inhoud van een in kaart gebracht Stroom dat wordt geproduceerd door de verstrekte mapping-functie op elk element toe te passen.

Het onderstaande voorbeeld toont het samenvoegen van verzamelingen met behulp van de flatMap () methode. In eerste instantie krijg je een Stroom waarvan de elementen de twee collecties zijn, en dan maak je de Stroom voordat u het in een samengevoegde lijst verzamelt:

Stream combinedStream = Stream.of (collectionA, collectionB) .flatMap (Collectie :: stream); Collectie collectionCombined = combinedStream.collect (Collectors.toList ());

3. Guava gebruiken

De Guava-bibliotheek van Google biedt verschillende handige methoden voor het werken met verzamelingen en kan worden gebruikt met Java 6 of hoger.

3.1. De ... gebruiken Iterables.concat () Methode

De Iterables.concat () methode is een van de handige Guava-methoden die wordt gebruikt voor het samenvoegen van verzamelingen:

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

De Herhaalbaar die wordt geretourneerd kan worden omgezet in een collectie:

Collectie collectionCombined = Lists.newArrayList (combinedIterables);

3.2. Afhankelijkheid van Maven

Voeg de volgende afhankelijkheid toe aan uw Maven pom.xml bestand om de Guava-bibliotheek in uw project op te nemen:

 com.google.guava guave 20.0 

Je kunt de nieuwste versie van de Guava-bibliotheek vinden in de Maven Central-repository.

4. Apache Commons-verzamelingen gebruiken

Apache Commons Collections is nog een andere bibliotheek met hulpprogramma's die helpen bij het werken met de verschillende collecties. De bibliotheek biedt twee hulpprogramma-methoden die kunnen worden gebruikt om verzamelingen te combineren. Laten we in dit gedeelte begrijpen hoe deze methoden werken.

4.1. De ... gebruiken IterableUtils.chainedIterable () Methode

De IterableUtils klasse biedt gebruiksmethoden en decorateurs voor Herhaalbaar gevallen. Het biedt de geketend methode, die kan worden gebruikt om meerdere te combineren Herhaalbaars in een enkele.

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

4.2. De ... gebruiken CollectionUtils.union () Methode

Gebruiksmethoden en decorateurs voor Verzameling exemplaren worden geleverd door de CollectionUtils klasse. De unie() methode uit deze klasse retourneert een Verzameling met daarin de vereniging van het gegeven Herhaalbaar gevallen.

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

In het geval van de unie() methode, is de kardinaliteit van elk element in de geretourneerde verzameling gelijk aan het maximum van de kardinaliteit van dat element in de twee gegeven Iterables. Dit betekent dat de gecombineerde collectie alleen bestaat uit de elementen uit de eerste collectie en de elementen uit de tweede collectie die in de eerste niet aanwezig waren.

4.3. Afhankelijkheid van Maven

Voeg de volgende afhankelijkheid toe aan uw Maven pom.xml bestand om de Apache Commons Collections-bibliotheek in uw project op te nemen:

 org.apache.commons commons-collections4 4.1 

Je kunt de nieuwste versie van de Apache Commons-bibliotheek vinden in de Maven Central-repository.

5. Java 7 gebruiken

Als u nog steeds Java 7 gebruikt en bibliotheken van derden zoals Guava wilt vermijden, kunt u het Voeg alles toe() methode om elementen uit meerdere verzamelingen te combineren, of u kunt uw eigen hulpprogramma-methoden schrijven om te combineren Iterables.

5.1. De ... gebruiken Voeg alles toe() Methode

De eenvoudigste oplossing voor het combineren van collecties is natuurlijk het gebruik van de Voeg alles toe() methode, zoals in het volgende Lijst Het is echter vermeldenswaard dat deze methode een nieuwe collectie creëert met aanvullende verwijzingen naar dezelfde objecten die zich in de eerste twee collecties bevinden:

List listC = nieuwe ArrayList (); listC.addAll (lijstA); listC.addAll (lijstB);

5.2. Een gewoonte schrijven concat () Methode

Het onderstaande voorbeeld definieert een concat () methode die twee accepteert Iterables en retourneert een samengevoegd Herhaalbaar voorwerp:

openbare statische Iterable concat (Iterable i1, Iterable i2) {retourneer nieuwe Iterable () {public Iterator iterator () {retourneer nieuwe Iterator () {Iterator listIterator = i1.iterator (); Boolean checkHasNext; E volgendeValue; private boolean startTheSecond; void theNext () {if (listIterator.hasNext ()) {CheckedHasNext = true; nextValue = listIterator.next (); } else if (startTheSecond) checkHasNext = false; anders {startTheSecond = true; listIterator = i2.iterator (); de volgende(); }} openbare boolean hasNext () {if (checkHasNext == null) theNext (); return checkHasNext; } public E next () {if (! hasNext ()) gooi nieuwe NoSuchElementException (); checkHasNext = null; return nextValue; } public void remove () {listIterator.remove (); }}; }}; }

De concat () methode kan worden aangeroepen door de twee verzamelingen als argumenten door te geven:

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

Als je de Herhaalbaar beschikbaar zijn als een Lijst, kunt u ook de makeListFromIterable () methode die een Lijst met behulp van de leden van de Herhaalbaar:

openbare statische lijst makeListFromIterable (itereerbare iter) {Lijstlijst = nieuwe ArrayList (); voor (E item: iter) {list.add (item); } retourlijst; }

6. Conclusie

Het artikel besprak verschillende manieren om twee verzamelingen logisch te combineren in Java zonder extra verwijzingen te maken naar de objecten die ze bevatten.

De code voor deze tutorial is beschikbaar op Github.