Java - Kombiner flere samlinger

1. Oversikt

I denne opplæringen vil vi illustrere hvordan du kan sammenkoble flere samlinger til en logisk samling.

Vi skal utforske fem forskjellige tilnærminger - to som bruker Java 8, en bruker Guava, en bruker Apache Commons Collections, og en bruker bare standard Java 7 SDK.

I eksemplene som følger, la oss vurdere følgende samlinger:

Collection collectionA = Arrays.asList ("S", "T"); Samling samlingB = Arrays.asList ("U", "V");

2. Bruke Java 8 Strøm API

De Strøm grensesnitt i Java API gir nyttige metoder som gjør det lettere å behandle samlinger. La oss ta en titt på to av metodene - concat () og flatMap () - som brukes til å kombinere samlinger.

Når du får en Strøm, kan du utføre samlede operasjoner på den.

2.1. Bruker concat () Metode

Den statiske metoden concat () kombinerer to Strømmer logisk ved å lage en lat sammenkoblet Strøm hvis elementer er alle elementene i den første Strøm etterfulgt av alle elementene i det andre Strøm.

I eksemplet nedenfor, la oss kombinere samling A. og samlingB bruker concat () metode:

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

Hvis du trenger å kombinere mer enn to Strømmer, kan du påberope deg concat () metoden igjen fra den opprinnelige påkallelsen:

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

Det er viktig å merke seg at Java 8 Strømmer kan ikke gjenbrukes, så du bør ta hensyn til dette når du tilordner dem til variabler.

2.2. Bruker flatMap () Metode

De flatMap () metoden returnerer a Strøm etter å ha erstattet hvert element i dette Strøm med innholdet i en kartlagt Strøm som produseres ved å bruke den medfølgende kartleggingsfunksjonen på hvert element.

Eksemplet nedenfor viser sammenslåing av samlinger ved hjelp av flatMap () metode. I utgangspunktet får du en Strøm elementene er de to samlingene, og deretter flater du Strøm før du samler den inn i en sammenslått liste:

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

3. Bruke Guava

Guava-biblioteket fra Google tilbyr flere praktiske metoder for drift av samlinger og kan brukes med Java 6 eller nyere.

3.1. Bruker Iterables.concat () Metode

De Iterables.concat () metoden er en av de praktiske metodene som brukes til å slå sammen samlinger:

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

De Iterabel som returneres kan konverteres til en samling:

Collection collectionCombined = Lists.newArrayList (combinedIterables);

3.2. Maven avhengighet

Legg til følgende avhengighet til Maven pom.xml fil for å inkludere Guava-biblioteket i prosjektet ditt:

 com.google.guava guava 20.0 

Du finner den nyeste versjonen av Guava-biblioteket i Maven Central-arkivet.

4. Bruke Apache Commons-samlinger

Apache Commons Collections er enda et bibliotek med verktøy som hjelper deg med å jobbe med de forskjellige samlingene. Biblioteket tilbyr to verktøymetoder som kan brukes til å kombinere samlinger. La oss i denne delen forstå hvordan disse metodene fungerer.

4.1. Bruker IterableUtils.chainedIterable () Metode

De IterableUtils klasse gir bruksmetoder og dekoratører for Iterabel tilfeller. Det gir den kjedetIterabelt () metode, som kan brukes til å kombinere flere Iterabels til en enkelt.

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

4.2. Bruker CollectionUtils.union () Metode

Verktøysmetoder og dekoratører for Samling tilfeller er levert av CollectionUtils klasse. De fagforening () metoden fra denne klassen returnerer a Samling inneholder foreningen av det gitte Iterabel tilfeller.

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

I tilfelle av fagforening () metode, vil kardinaliteten til hvert element i den returnerte samlingen være lik maksimumet for kardinaliteten til det elementet i de to gitte Iterables. Dette betyr at den kombinerte samlingen bare består av elementene i den første samlingen og elementene i den andre samlingen som ikke var til stede i den første.

4.3. Maven avhengighet

Legg til følgende avhengighet til Maven pom.xml fil for å inkludere biblioteket Apache Commons Collections i prosjektet ditt:

 org.apache.commons commons-collection4 4.1 

Du finner den siste versjonen av Apache Commons-biblioteket i Maven Central-arkivet.

5. Bruke Java 7

Hvis du fortsatt bruker Java 7 og ønsker å unngå tredjepartsbiblioteker som Guava, kan du bruke Legg til alle() metode for å kombinere elementer fra flere samlinger, eller du kan skrive dine egne verktøymetoder for å kombinere Iterables.

5.1. Bruker Legg til alle() Metode

Selvfølgelig er den enkleste løsningen for å kombinere samlinger å bruke Legg til alle() metode, som i det følgende Liste eksempel, men det er verdt å merke seg at denne metoden oppretter en ny samling med tilleggsreferanser til de samme objektene som er i de to første samlingene:

ListelisteC = ny ArrayList (); listC.addAll (listA); listC.addAll (listeB);

5.2. Skrive en egendefinert concat () Metode

Eksemplet nedenfor definerer a concat () metode som godtar to Iterables og returnerer en sammenslått Iterabel gjenstand:

public static Iterable concat (Iterable i1, Iterable i2) {return new Iterable () {public Iterator iterator () {return new Iterator () {Iterator listIterator = i1.iterator (); Boolsk sjekketHasNeste; E neste verdi; privat boolsk startTheSecond; ugyldigNeste () {if (listIterator.hasNext ()) {checkedHasNext = true; nextValue = listIterator.next (); } annet hvis (startTheSecond) avkryssetHasNeste = falske; annet {startTheSecond = true; listIterator = i2.iterator (); den neste(); }} public boolean hasNext () {if (checkedHasNext == null) theNext (); retur sjekketHasNeste; } public E next () {if (! hasNext ()) throw new NoSuchElementException (); checkedHasNext = null; returner nextValue; } offentlig tomrom fjerne () {listIterator.remove (); }}; }}; }

De concat () metoden kan påkalles ved å sende de to samlingene som argumenter:

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

Hvis du trenger Iterabel å være tilgjengelig som en Liste, kan du også bruke makeListFromIterable () metode som skaper en Liste bruker medlemmene av Iterabel:

offentlig statisk liste makeListFromIterable (Iterable iter) {List list = new ArrayList (); for (E item: iter) {list.add (item); } returliste; }

6. Konklusjon

Artikkelen diskuterte flere forskjellige måter å kombinere to samlinger logisk i Java uten å lage flere referanser til objektene de inneholder.

Koden for denne opplæringen er tilgjengelig på Github.


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