Zipper des collections en Java

1. Introduction

Dans ce didacticiel, nous allons illustrer comment compresser deux collections en une seule collection logique.

L'opération « zip» est légèrement différente de l'opération «concat» ou «fusion» standard . Alors que les opérations «concat» ou «fusion» ajouteront simplement la nouvelle collection à la fin de la collection existante, l' opération « zip» prendra un élément de chaque collection et les combinera.

La bibliothèque principale ne supporte pas implicitement « zip» , mais il existe certainement des bibliothèques tierces qui présentent cette opération utile.

Considérez deux listes, l'une contenant les noms de personnes, l'autre contenant leur âge.

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

Après la compression, nous nous retrouvons avec des paires nom-âge construites à partir des éléments correspondants de ces deux collections.

2. Utilisation de Java 8 IntStream

En utilisant le noyau Java, nous pourrions générer des index à l'aide d' IntStream , puis les utiliser pour extraire les éléments correspondants de deux collections:

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

3. Utilisation de Guava Streams

À partir de la version 21, Google Guava fournit une méthode d'assistance zip dans la classe Streams . Cela supprime tous les tracas liés à la création et au mappage d'index et réduit la syntaxe aux entrées et aux opérations:

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

4. Utilisation de jOOλ (jOOL)

jOOL fournit également certains des ajouts fascinants par rapport à Java 8 Lambda, et avec le support de Tuple1 à Tuple16, l'opération zip devient beaucoup plus intéressante:

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

Cela produira un résultat d'une Seq contenant Tuples des éléments à fermeture éclair:

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

La méthode zip de jOOL donne la flexibilité de fournir une fonction de transformation personnalisée:

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

ou si l'on souhaite zipper avec index uniquement, il peut utiliser la méthode zipWithIndex fournie par jOOL:

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

5. Conclusion

Dans ce rapide didacticiel, nous avons examiné comment effectuer l' opération zip .

Comme toujours, les exemples de code de l'article se trouvent à l'adresse over sur GitHub.