Java - Kombiner flere samlinger

1. Oversigt

I denne vejledning vil vi illustrere, hvordan man sammenkæder flere samlinger til en logisk samling.

Vi vil undersøge fem forskellige tilgange - to ved hjælp af Java 8, en ved hjælp af Guava, en ved hjælp af Apache Commons Collections og en, der kun bruger standard Java 7 SDK.

Lad os i følgende eksempler overveje følgende samlinger:

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

2. Brug af Java 8 Strøm API

Det Strøm interface i Java API giver nyttige metoder, der gør det lettere at behandle samlinger. Lad os se på to af dens metoder - concat () og flatMap () - der bruges til at kombinere samlinger.

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

2.1. Bruger concat () Metode

Den statiske metode concat () kombinerer to Strømme logisk ved at oprette en doven sammenkædet Strøm hvis elementer er alle elementerne i den første Strøm efterfulgt af alle elementerne i det andet Strøm.

Lad os kombinere i nedenstående eksempel samling A. og samlingB bruger concat () metode:

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

Hvis du har brug for at kombinere mere end to Strømme, kan du påberåbe sig concat () metode igen fra den oprindelige påkaldelse:

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

Det er vigtigt at bemærke, at Java 8 Strømme ikke kan genbruges, så du bør tage dette i betragtning, når du tildeler dem til variabler.

2.2. Bruger flatMap () Metode

Det flatMap () metode returnerer a Strøm efter udskiftning af hvert element i dette Strøm med indholdet af en kortlagt Strøm der produceres ved at anvende den leverede kortlægningsfunktion på hvert element.

Eksemplet nedenfor viser sammenlægning af samlinger ved hjælp af flatMap () metode. Oprindeligt får du en Strøm hvis elementer er de to samlinger, og derefter flader du Strøm inden du indsamler den på en flettet liste:

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

3. Brug af Guava

Guava-biblioteket fra Google indeholder flere praktiske metoder til drift af samlinger og kan bruges med Java 6 eller nyere.

3.1. Bruger Iterables.concat () Metode

Det Iterables.concat () metode er en af ​​de praktiske Guava-metoder, der bruges til at flette samlinger:

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

Det Iterabel der returneres kan konverteres til en samling:

Collection collectionCombined = Lists.newArrayList (combinedIterables);

3.2. Maven afhængighed

Føj følgende afhængighed til din Maven pom.xml fil for at inkludere Guava-biblioteket i dit projekt:

 com.google.guava guava 20.0 

Du kan finde den nyeste version af Guava-biblioteket i Maven Central-arkivet.

4. Brug af Apache Commons-samlinger

Apache Commons Collections er endnu et bibliotek med hjælpeprogrammer, der hjælper med at arbejde med de forskellige samlinger. Biblioteket indeholder to hjælpemetoder, der kan bruges til at kombinere samlinger. Lad os i dette afsnit forstå, hvordan disse metoder fungerer.

4.1. Bruger IterableUtils.chainedIterable () Metode

Det IterableUtils klasse giver hjælpemetoder og dekoratører til Iterabel tilfælde. Det giver den lænketIterabel () metode, som kan bruges til at kombinere flere Iterabels til en enkelt.

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

4.2. Bruger CollectionUtils.union () Metode

Hjælpemetoder og dekoratører til Kollektion tilfælde leveres af CollectionUtils klasse. Det Union() metode fra denne klasse returnerer a Kollektion indeholdende foreningen af ​​det givne Iterabel tilfælde.

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

I tilfælde af Union() metode, vil kardinaliteten af ​​hvert element i den returnerede samling være lig med det maksimale af kardinaliteten af ​​det element i de to givne Iterables. Dette betyder, at den samlede samling kun består af elementerne i den første samling og de elementer i den anden samling, der ikke var til stede i den første.

4.3. Maven afhængighed

Føj følgende afhængighed til din Maven pom.xml fil for at inkludere Apache Commons Collections-biblioteket i dit projekt:

 org.apache.commons commons-collection4 4.1 

Du kan finde den nyeste version af Apache Commons-biblioteket i Maven Central-arkivet.

5. Brug af Java 7

Hvis du stadig bruger Java 7 og ønsker at undgå tredjepartsbiblioteker såsom Guava, kan du bruge tilføjAlle () metode til at kombinere elementer fra flere samlinger, eller du kan skrive dine egne hjælpemetoder til at kombinere Iterables.

5.1. Bruger tilføjAlle () Metode

Selvfølgelig er den enkleste løsning til at kombinere samlinger at bruge tilføjAlle () metode, som i det følgende Liste eksempel, men det er værd at bemærke, at denne metode opretter en ny samling med yderligere referencer til de samme objekter, der er i de to første samlinger:

Liste listeC = ny ArrayList (); listC.addAll (listA); listC.addAll (listeB);

5.2. Skrivning af en brugerdefineret concat () Metode

Nedenstående eksempel definerer a concat () metode, der accepterer to Iterables og returnerer en flettet Iterabel objekt:

public static Iterable concat (Iterable i1, Iterable i2) {return new Iterable () {public Iterator iterator () {return new Iterator () {Iterator listIterator = i1.iterator (); Boolsk kontrolleretHasNext; E næste værdi; privat boolsk startTheSecond; annullereNext () {if (listIterator.hasNext ()) {checkedHasNext = true; nextValue = listIterator.next (); } ellers hvis (startTheSecond) kontrolleretHasNext = false; ellers {startTheSecond = sandt; listIterator = i2.iterator (); den næste(); }} offentlig boolsk hasNext () {if (markeretHasNext == null) theNext (); return kontrolleretHasNext; } public E next () {if (! hasNext ()) throw new NoSuchElementException (); checkedHasNext = null; returner nextValue; } offentlig tomrum fjern () {listIterator.remove (); }}; }}; }

Det concat () metode kan påberåbes ved at sende de to samlinger som dens argumenter:

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

Hvis du har brug for Iterabel at være tilgængelig som en Liste, kan du også bruge makeListFromIterable () metode, der skaber en Liste ved hjælp af medlemmerne af Iterabel:

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

6. Konklusion

Artiklen diskuterede flere forskellige måder at kombinere to samlinger logisk i Java uden at oprette yderligere referencer til de objekter, de indeholder.

Koden til denne tutorial er tilgængelig på Github.