Verschiedene Arten von Sammlungen in Java kombinieren

Verschiedene Arten von Sammlungen in Java kombinieren

1. Einführung

In diesem kurzen Tutorial werden verschiedene Möglichkeiten zum Kombinieren von Sammlungen in Java untersucht.

Wir werden verschiedene Ansätze mit Java und externen Frameworks wie Guava, Apache usw. untersuchen. Schauen Sie sich für die Einführung in Sammlungenat this series here an.

2. Externe Bibliotheken für die Arbeit mit Sammlungen

Neben nativen Ansätzen werden auch externe Bibliotheken verwendet. Bitte fügen Sie die folgenden Abhängigkeiten inpom.xml hinzu:


    org.apache.commons
    commons-collections4
    4.2


    org.apache.commons
    commons-exec
    1.3


    com.google.guava
    guava
    26.0-jre

Die neuesten Versionen finden Sie in Maven Central fürCommons,Commons-exec undGuava.

3. Arrays in Java kombinieren

3.1. Native Java-Lösung

Java verfügt über eine integriertevoid arraycopy()-Methode, mit der ein bestimmtes Quellarray in das Zielarray kopiert wird.

Wir können es auf folgende Weise verwenden:

Object[] combined = new Object[first.length + second.length];
System.arraycopy(first, 0, combined, 0, first.length);
System.arraycopy(second, 0, combined, first.length, second.length);

In dieser Methode geben wir zusammen mit den Array-Objekten auch die Position an, von der kopiert werden soll, und übergeben den Längenparameter.

Dies ist eine native Java-Lösung, daher sind keine externen Bibliotheken erforderlich.

3.2. Verwenden der Java 8Stream-API

Streams bieten eine effektive Möglichkeit, verschiedene Arten von Sammlungen zu durchlaufen. Um mit Streams zu beginnen, gehen Sie zuJava 8 Stream API Tutorial.

Um Arrays mitStream zu kombinieren, können wir diesen Code verwenden:

Object[] combined = Stream.concat(Arrays.stream(first), Arrays.stream(second)).toArray();

Stream.concat() erstellt einen verketteten Stream, in dem auf die Elemente des ersten Streams die Elemente des zweiten Streams folgen, der anschließend mit der MethodetoArray() m in ein Array konvertiert wird.

Der Prozess zum Erstellen des Streams ist für verschiedene Arten von Sammlungen identisch. Wir können es jedoch auf verschiedene Arten sammeln, um verschiedene Datenstrukturen daraus abzurufen.

Wir werden diese Methode in Abschnitt 4.2 erneut betrachten. und 5.2. um zu sehen, wie wir dieselbe Methode fürLists undSets verwenden können.

3.3. Verwenden vonArrayUtils aus Apache Commons

Die Apache-Commons-Bibliothek stellt uns die MethodeaddAll()aus dem PaketArrayUtilszur Verfügung. Wir können Ziel- und Quell-Array als Parameter angeben, und diese Methode gibt ein kombiniertes Array zurück:

Object[] combined = ArrayUtils.addAll(first, second);

Diese Methode wird auch im ArtikelArray Processing with Apache Commons Lang 3ausführlich erläutert.

3.4. Mit Guave

Guave stellt uns dieconcat()-Methode für denselben Zweck zur Verfügung:

Object [] combined = ObjectArrays.concat(first, second, Object.class);

Es kann mit verschiedenen Datentypen verwendet werden und akzeptiert zwei Quell-Arrays zusammen mit dem Klassenliteral, um das kombinierte Array zurückzugeben.

4. List in Java kombinieren

4.1. Verwenden der nativenaddAll()-Methode vonCollection

DieCollection-Schnittstelle selbst stellt uns dieaddAll()-Methode zur Verfügung, mit der alle Elemente in der angegebenen Auflistung zum Aufruferobjekt hinzugefügt werden. Dies wird auch inthis example article: ausführlich erörtert

List combined = new ArrayList<>();
combined.addAll(first);
combined.addAll(second);


Da dieses Verfahren in der übergeordneten Schnittstelle des Collections-Frameworks bereitgestellt wird, d. H. In derCollection-Schnittstelle, kann es auf alleLists undSets angewendet werden.

4.2. Java verwenden 8

Wir könnenStream undCollectors folgendermaßen verwenden, umLists zu kombinieren:

List combined = Stream.concat(first.stream(), second.stream()).collect(Collectors.toList());


Dies ist dasselbe wie beiArrays in Abschnitt 3.2, aber anstatt es in ein Array zu konvertieren, haben wir Kollektoren verwendet, um es in eine Liste zu konvertieren. Um mehr über dieCollectors im Detail zu erfahren, besuchen SieGuide to Java 8’s Collectors.

Wir könnenflatMaps auch folgendermaßen verwenden:

List combined = Stream.of(first, second).flatMap(Collection::stream).collect(Collectors.toList());


First, we’re using Stream.of() which returns a sequential stream of two lists –  first and second. We’ll then pass it to flatMap which will return the contents of a mapped stream after applying the mapping function. Diese Methode wird auch im Artikel vonMerging Streams in Javabeschrieben.

Um mehr über dieflatMap zu erfahren, gehen Sie zuthis example article.

4.3. Verwenden vonListUtils aus Apache Commons

CollectionUtils.union löst die Vereinigung zweier Sammlungen und gibt eine Sammlung zurück, die alle Elemente enthält:

List combined = ListUtils.union(first, second);


Diese Methode wird auch inA Guide to Apache Commons Collections CollectionUtils diskutiert. Weitere Informationen finden Sie in Abschnitt 4.9. dieses Artikels.

4.4. Mit Guave

To merge a List using Guava, we’ll use Iterable which consists of the concat() method. Nach dem Verketten aller Sammlungen können wir schnell das kombinierteList-Objekt abrufen, wie in diesem Beispiel gezeigt:

Iterable combinedIterables = Iterables
  .unmodifiableIterable(Iterables.concat(first, second));
List combined = Lists.newArrayList(combinedIterables);





5. Set in Java kombinieren

5.1. Einfache Java-Lösung

Wie bereits in Abschnitt 4.1 erläutert, verfügt dieCollection-Schnittstelle über eine integrierteaddAll()-Methode, mit der auchLists undSets kopiert werden können:

Set combined = new HashSet<>();
combined.addAll(first);
combined.addAll(second);



5.2. Verwenden von Java 8-Streams

Die gleiche Funktion, die wir fürList -Objekte verwendet haben, kann hier angewendet werden:

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


Der einzige bemerkenswerte Unterschied beim Vergleich mit der Liste besteht darin, dass wir anstelle vonCollectors.toList()Collectors.toSet() verwenden, um alle Elemente aus den bereitgestellten zwei Streams in einem neuenSet zu akkumulieren.

Und ähnlich wie beiLists würde es bei Verwendung vonflatMaps onSets folgendermaßen aussehen:

Set combined = Stream.of(first, second)
  .flatMap(Collection::stream)
  .collect(Collectors.toSet());



5.3. Verwenden von Apache Commons

Ähnlich wie beiListUtils können wir auch mitSetUtils arbeiten, die eine Vereinigung vonSet Elementen durchführen:

Set combined = SetUtils.union(first, second);



5.4. Verwenden von Guave

Die Guava-Bibliothek bietet uns die einfache MethodeSets.union(), umSetsin Java zu kombinieren:

Set combined = Sets.union(first, second);





6. Map in Java kombinieren

6.1. Einfache Java-Lösung

Wir können dieMap-Schnittstelle verwenden, die uns selbst dieputAll()-Methode zur Verfügung stellt, mit der alle Zuordnungen vom angegebenen Argument desMap-Objekts in das Objekt des AufrufersMapkopiert werden ::

Map combined = new HashMap<>();
combined.putAll(first);
combined.putAll(second);

6.2. Java verwenden 8

Since Java 8, the Map class consists of merge() method which accepts a key, value, and a BiFunction. Wir können dies mit einer Java 8forEach-Anweisung verwenden, um die Zusammenführungsfunktionalität zu erreichen:

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

Der dritte Parameter, d. H. Die Neuzuordnungsfunktion, ist nützlich, wenn in beiden Quellenzuordnungen dasselbe Schlüssel-Wert-Paar vorhanden ist. Diese Funktion gibt an, was mit diesen Wertetypen geschehen soll.

Wir können auchflatMapwie folgt verwenden:

Map combined = Stream.of(first, second)
  .map(Map::entrySet)
  .flatMap(Collection::stream)
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, String::concat));

6.3. Verwenden von Apache Commons Exec

Map combined = MapUtils.merge(first, second);

6.4. Verwendung von Google Guava

Wir könnenImmutableMap verwenden, das von der Guava-Bibliothek von Google bereitgestellt wird. DieputAll()-Methode ordnet alle Schlüssel und Werte der angegebenen Karte der erstellten Karte zu:

Map combined = ImmutableMap.builder()
  .putAll(first)
  .putAll(second)
  .build();

7. Fazit

In diesem Artikel haben wir verschiedene Ansätze zur Kombination verschiedener Arten vonCollections durchlaufen. Wir haben diearrays,Lists,Sets undMaps zusammengeführt.

Wie immer finden Sie die vollständigen Codefragmente mit den richtigen Komponententests inover on GitHub.