Zipping des collections en Java

Zipper des collections en Java

1. introduction

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

The “zip” operation is slightly different from the standard “concat” or “merge”. Alors que les opérations «concat» ou «fusion» ajouteront simplement la nouvelle collection à la fin de la collection existante, «l'opérationzip” prendra un élément de chaque collection et les combinera.

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

Considérons deux listes, l’une contenant les noms des 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 compression, nous obtenons des paires nom-âge construites à partir d'éléments correspondants de ces deux collections.

2. Utilisation de Java 8IntStream

En utilisant le noyau Java, nous pourrions générer des index en utilisantIntStream, 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 goyaves

Google Guava 21 fournit une méthode d'assistancezip dans la classeStreams. Cela supprime tout le travail de création et de mappage des index et réduit la syntaxe aux entrées et aux opérations:

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

4. Utiliser jOOλ (jOOL)

jOOL fournit également certains des ajouts fascinants par rapport à Java 8 Lambda, et avec le support deTuple1 à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'unSeq contenantTuples d'éléments compressés:

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

La méthodejOOL’s zip 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 compresser uniquement avec l'index, il peut utiliser la méthodezipWithIndex fournie parjOOL:

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

5. Conclusion

Dans ce rapide tutoriel, nous avons vu comment effectuer l'opérationzip.

Comme toujours, les exemples de code dans l'article peuvent être trouvésover on GitHub.