Combineren van verschillende soorten verzamelingen in Java

1. Inleiding

In deze korte tutorial onderzoeken we verschillende manieren om verzamelingen in Java te combineren.

We zullen verschillende benaderingen onderzoeken met behulp van Java en externe frameworks zoals Guava, Apache, enz. Voor de introductie van Collections kun je deze serie hier bekijken.

2. Externe bibliotheken om met collecties te werken

Naast native benaderingen zullen we ook externe bibliotheken gebruiken. Voeg de volgende afhankelijkheden toe in het pom.xml:

 org.apache.commons commons-collections4 4.2 org.apache.commons commons-exec 1.3 com.google.guava guava 26.0-jre 

De nieuwste versies zijn te vinden op Maven Central for Commons, Commons-exec en Guava.

3. Combineren van arrays in Java

3.1. Native Java-oplossing

Java wordt geleverd met een ingebouwd leegte arraycopy () methode die een bepaalde bronarray kopieert naar de bestemde.

We kunnen het op de volgende manier gebruiken:

Object [] gecombineerd = nieuw Object [eerste.lengte + tweede.lengte]; System.arraycopy (eerste, 0, gecombineerd, 0, eerste.lengte); System.arraycopy (tweede, 0, gecombineerd, eerste.lengte, tweede.lengte);

In deze methode specificeren we, samen met de array-objecten, ook de positie van waaruit we moeten kopiëren, en we geven ook de parameter length door.

Dit is een native Java-oplossing, dus er zijn geen externe bibliotheken voor nodig.

3.2. Java 8 gebruiken Stroom API

Streams bieden een effectieve manier om verschillende soorten collecties te herhalen. Ga naar de Java 8 Stream API-zelfstudie om aan de slag te gaan met streams.

Om arrays te combineren met een Stroomkunnen we deze code gebruiken:

Object [] gecombineerd = Stream.concat (Arrays.stream (eerste), Arrays.stream (tweede)). ToArray ();

Stream.concat () creëert een aaneengeschakelde stream waarin de elementen van de eerste stream worden gevolgd door de elementen van de tweede stream, die daarna wordt geconverteerd naar een array met toArray () methode.

Het proces voor het maken van de stream is hetzelfde voor verschillende soorten collecties. We kunnen het echter op verschillende manieren verzamelen om er verschillende datastructuren uit te halen.

We zullen deze methode opnieuw bekijken in paragraaf 4.2. en 5.2. om te zien hoe we dezelfde methode kunnen gebruiken op Lijsten en Sets.

3.3. Gebruik makend van ArrayUtils van Apache Commons

Apache commons-bibliotheek biedt ons de Voeg alles toe() methode van de ArrayUtils pakket. We kunnen de doel- en bronarray als parameters opgeven en deze methode retourneert een gecombineerde array:

Object [] combined = ArrayUtils.addAll (eerste, tweede);

Deze methode wordt ook in detail besproken in het artikel Array Processing with Apache Commons Lang 3.

3.4. Guava gebruiken

Guava biedt ons de concat () methode voor hetzelfde doel:

Object [] combined = ObjectArrays.concat (eerste, tweede, Object.class);

Het kan worden gebruikt met verschillende gegevenstypen en het accepteert twee bronarrays samen met de letterlijke klasse om de gecombineerde array te retourneren.

4. Combineren Lijst in Java

4.1. Gebruik makend van Verzameling Inheems Voeg alles toe() Methode

De Verzameling interface zelf geeft ons de Voeg alles toe() methode, die alle elementen in de opgegeven verzameling toevoegt aan het aanroepobject. Dit wordt ook in detail besproken in dit Baeldung-artikel:

Lijst gecombineerd = nieuwe ArrayList (); combined.addAll (eerste); combined.addAll (tweede);

Omdat deze methode wordt aangeboden in de meest ouderlijke interface van het Collections-framework, d.w.z. Verzameling interface, het kan overal worden toegepast Lijsts en Sets.

4.2. Java 8 gebruiken

We kunnen gebruiken Stroom en Verzamelaars op de volgende manier te combineren Lijsten:

Lijst gecombineerd = Stream.concat (first.stream (), second.stream ()). Collect (Collectors.toList ());

Dit is hetzelfde als wat we deden in het geval van Arrays in sectie 3.2, maar in plaats van het naar een array te converteren, gebruikten we collectors om het naar een lijst te converteren. Om meer te weten te komen over het Verzamelaars Ga voor meer informatie naar Guide to Java 8’s Collectors.

We kunnen ook gebruik maken van flatMaps op deze manier:

Lijst gecombineerd = Stream.of (eerste, tweede) .flatMap (Collectie :: stream) .collect (Collectors.toList ());

Ten eerste gebruiken we Stroom van() die een opeenvolgende stroom van twee lijsten retourneert - eerste en tweede. We geven het dan door aan flatMap die de inhoud van een in kaart gebrachte stream retourneert na het toepassen van de mapping-functie. Deze methode wordt ook besproken in het artikel Streams samenvoegen in Java.

Voor meer informatie over het flatMap, ga dan naar dit Baeldung-artikel.

4.3. Gebruik makend van ListUtils van Apache Commons

CollectionUtils.union doet de vereniging van twee verzamelingen en geeft een verzameling terug die alle elementen bevat:

Lijst gecombineerd = ListUtils.union (eerste, tweede);

Deze methode wordt ook besproken in A Guide to Apache Commons Collections CollectionUtils. Ga voor meer informatie naar sectie 4.9. van dit artikel.

4.4. Guava gebruiken

Om een Lijst met behulp van Guava, zullen we gebruiken Herhaalbaar die bestaat uit de concat () methode. Nadat we alle verzamelingen hebben samengevoegd, kunnen we ze snel combineren Lijst object zoals getoond in dit voorbeeld:

Iterable combinedIterables = Iterables .unmodifiableIterable (Iterables.concat (eerste, tweede)); Lijst gecombineerd = Lists.newArrayList (combinedIterables);

5. Combineren Set in Java

5.1. Gewone Java-oplossing

Zoals we al hadden besproken in sectie 4.1., Wordt de Collection-interface geleverd met een ingebouwde Voeg alles toe() methode die kan worden gebruikt voor kopiëren Lijsten en Sets ook:

Set combined = new HashSet (); combined.addAll (eerste); combined.addAll (tweede);

5.2. Java 8 Streams gebruiken

Dezelfde functie die we hebben gebruikt Lijst objecten kunnen hier worden toegepast:

Set combined = Stream .concat (first.stream (), second.stream ()) .collect (Collectors.toSet ());

Het enige opvallende verschil hier bij het vergelijken met de lijst is dat in plaats van te gebruiken Collectors.toList (), we gebruiken Collectors.toSet () om alle elementen van de geleverde twee stromen te verzamelen in een nieuwe Set.

En vergelijkbaar met Lijsten, tijdens gebruik flatMaps Aan Sets, zou het eruit zien als:

Set combined = Stream.of (eerste, tweede) .flatMap (Collectie :: stream) .collect (Collectors.toSet ());

5.3. Apache Commons gebruiken

Net als bij de ListUtils, kunnen we ook werken met de SetUtils dat doet een unie van Set elementen:

Set combined = SetUtils.union (eerste, tweede);

5.4. Met behulp van Guava

De Guava-bibliotheek biedt ons eenvoudig Sets. Unie () methode om te combineren Sets in Java:

Set combined = Sets.union (eerste, tweede);

6. Combineren Kaart in Java

6.1. Gewone Java-oplossing

We kunnen gebruik maken van de Kaart interface die ons zelf de zet alle() methode die alle toewijzingen kopieert van het opgegeven argument van Kaart bezwaar maken tegen de beller Kaart voorwerp:

Kaart gecombineerd = nieuwe HashMap (); combined.putAll (eerste); combined.putAll (tweede);

6.2. Java 8 gebruiken

Sinds Java 8 is het Kaart klasse bestaat uit samenvoegen() methode die een sleutel, waarde en een BiFunction accepteert. We kunnen dit gebruiken met een Java 8 forEach-statement om samenvoegfunctionaliteit te bereiken:

second.forEach ((key, value) -> first.merge (key, value, String :: concat));

De derde parameter, d.w.z. remapping-functie, is handig wanneer hetzelfde sleutel-waardepaar aanwezig is in beide bronkaarten. Deze functie specificeert wat er moet gebeuren met dat type waarden.

We kunnen ook gebruik maken van flatMap soortgelijk:

Map gecombineerd = Stream.of (eerste, tweede) .map (Map :: entrySet) .flatMap (Collectie :: stream) .collect (Collectors.toMap (Map.Entry :: getKey, Map.Entry :: getValue, String: : concat));

6.3. Apache Commons Exec gebruiken

Apache Commons Exec biedt ons een eenvoudig samenvoegen (eerste kaart, tweede kaart) methode:

Kaart gecombineerd = MapUtils.merge (eerste, tweede);

6.4. Met Google Guava

We kunnen gebruiken Onveranderlijke kaart geleverd door de Guava-bibliotheek van Google. Haar zet alle() methode koppelt alle sleutels en waarden van de gegeven kaart aan de gebouwde kaart:

Map gecombineerd = ImmutableMap.builder () .putAll (eerste) .putAll (tweede) .build ();

7. Conclusie

In dit artikel hebben we verschillende benaderingen doorlopen om verschillende soorten Collecties. We hebben het arrays, Lijsten, Sets, en Kaarten.

Zoals altijd zijn de volledige codefragmenten met hun juiste eenheidstests te vinden op GitHub.