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:
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:
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:
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
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
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
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.
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
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:
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önnenImmutableMapverwenden, das von der Guava-Bibliothek von Google bereitgestellt wird. DieputAll()-Methode ordnet alle Schlüssel und Werte der angegebenen Karte der erstellten Karte zu:
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.