Zippen von Sammlungen in Java

Komprimieren von Sammlungen in Java

1. Einführung

In diesem Tutorial wird veranschaulicht, wie zwei Sammlungen in eine logische Sammlung komprimiert werden.

The “zip” operation is slightly different from the standard “concat” or “merge”. Während die Operationen "concat" oder "merge" einfach die neue Sammlung am Ende der vorhandenen Sammlung hinzufügen, nimmt die Operation "zip”" ein Element aus jeder Sammlung und kombiniert sie.

Die Kernbibliothek unterstützt nicht implizit „zip”, aber es gibt sicherlich Bibliotheken von Drittanbietern, die diese nützliche Operation bieten.

Betrachten Sie zwei Listen, eine mit Namen von Personen, die andere enthält deren Alter.

List names = new ArrayList<>(Arrays.asList("John", "Jane", "Jack", "Dennis"));

List ages = new ArrayList<>(Arrays.asList(24, 25, 27));

Nach dem Zippen erhalten wir Namens-Alters-Paare, die aus entsprechenden Elementen dieser beiden Sammlungen aufgebaut sind.

2. Verwenden von Java 8IntStream

Mit Kern-Java könnten wir Indizes mitIntStream generieren und sie dann verwenden, um entsprechende Elemente aus zwei Sammlungen zu extrahieren:

IntStream
  .range(0, Math.min(names.size(), ages.size()))
  .mapToObj(i -> names.get(i) + ":" + ages.get(i))
  // ...

3. Verwenden von Guaven-Streams

Google Guava 21 bietet eine Hilfsmethodezipin der KlasseStreams. Das erspart das Erstellen und Zuordnen von Indizes und reduziert die Syntax auf Eingaben und Operationen:

Streams
  .zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
  // ...

4. JOOλ (jOOL) verwenden

jOOL bietet auch einige der faszinierenden Ergänzungen zu Java 8 Lambda, und mit der Unterstützung vonTuple1 bisTuple16, wird die Zip-Operation viel interessanter:

Seq
  .of("John","Jane", "Dennis")
  .zip(Seq.of(24,25,27));

Dies führt zu einem Ergebnis vonSeq, dasTuples gezippter Elemente enthält:

(tuple(1, "a"), tuple(2, "b"), tuple(3, "c"))

Die Methode vonjOOL’s zipbietet die Flexibilität, benutzerdefinierte Transformationsfunktionen bereitzustellen:

Seq
  .of(1, 2, 3)
  .zip(Seq.of("a", "b", "c"), (x, y) -> x + ":" + y);

oder wenn man nur mit dem Index zippen möchte, kann man mit der vonjOOL: bereitgestellten MethodezipWithIndex arbeiten

Seq.of("a", "b", "c").zipWithIndex();

5. Fazit

In diesem kurzen Tutorial haben wir uns angesehen, wie die Operationzipausgeführt wird.

Wie immer finden Sie die Codebeispiele im Artikelover on GitHub.