Comprimere le raccolte in Java

1. Introduzione

In questo tutorial, illustreremo come comprimere due raccolte in una raccolta logica.

L' operazione " zip" è leggermente diversa dallo standard "concat" o "merge" . Mentre le operazioni "concat" o "merge" aggiungeranno semplicemente la nuova raccolta alla fine della raccolta esistente, l' operazione " zip" prenderà un elemento da ogni raccolta e li combinerà.

La libreria principale non supporta implicitamente " zip" , ma ci sono certamente librerie di terze parti che presentano questa utile operazione.

Considera due elenchi, uno con nomi di persone, l'altro contiene le loro età.

List names = new ArrayList(Arrays.asList("John", "Jane", "Jack", "Dennis")); List ages = new ArrayList(Arrays.asList(24, 25, 27));

Dopo aver zippato, ci ritroviamo con coppie nome-età costruite da elementi corrispondenti di quelle due raccolte.

2. Utilizzo di Java 8 IntStream

Utilizzando Java core, potremmo generare indici utilizzando IntStream e quindi utilizzarli per estrarre gli elementi corrispondenti da due raccolte:

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

3. Utilizzo di Guava Streams

A partire dalla versione 21, Google Guava fornisce un metodo di supporto zip nella classe Streams . Ciò elimina tutto il problema della creazione e della mappatura degli indici e riduce la sintassi agli input e alle operazioni:

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

4. Utilizzo di jOOλ (jOOL)

jOOL fornisce anche alcune delle affascinanti aggiunte su Java 8 Lambda e, con il supporto da Tuple1 a Tuple16, l'operazione zip diventa molto più interessante:

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

Questo produrrà un risultato di un Seq contenente Tuple di elementi zippati:

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

Il metodo zip di jOOL offre la flessibilità di fornire una funzione di trasformazione personalizzata:

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

o se si desidera comprimere solo con indice, si può utilizzare il metodo zipWithIndex fornito da jOOL:

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

5. conclusione

In questo breve tutorial, abbiamo visto come eseguire l' operazione di zip .

Come sempre, gli esempi di codice nell'articolo possono essere trovati su GitHub.