Zipping Collections in Java

1. Introduction

In this tutorial, we’ll illustrate how to zip two collections into one logical collection.

The “zip” operation is slightly different from the standard “concat” or “merge”. While the “concat” or “merge” operations will simply add the new collection at the end of the existing collection, “zip” operation will take an element from each collection and combine them.

The core library does not support “zip” implicitly, but there are certainly third-party libraries which do feature this useful operation.

Consider two lists, one having names of people, other contains their ages.

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

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

After zipping, we end up with name-age pairs constructed from corresponding elements from those two collections.

2. Using Java 8 IntStream

Using core Java, we could generate indexes using IntStream and then use them to extract corresponding elements from two collections:

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

3. Using Guava Streams

Starting version 21, Google Guava provides a zip helper method in the Streams class. This removes all the fuss of creating and mapping indexes and reduces the syntax to inputs and operations:

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

4. Using jOOλ (jOOL)

jOOL also provides some of the fascinating additions over Java 8 Lambda, and with the support of Tuple1 to Tuple16, the zip operation becomes much more interesting:

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

This will produce a result of a Seq containing Tuples of zipped elements:

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

jOOL’s zip method gives the flexibility to provide custom transformation function:

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

or if one wishes to zip with index only, he can go with the zipWithIndex method provided by jOOL:

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

5. Conclusion

In this quick tutorial, we had a look at how to perform the zip operation.

As always, the code examples in the article can be found over on GitHub.

Related posts:

Java Program to Construct an Expression Tree for an Infix Expression
Guide To CompletableFuture
The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5
Spring Boot - Database Handling
SOAP Web service: Upload và Download file sử dụng MTOM trong JAX-WS
Using Optional with Jackson
Java Program to Perform Inorder Non-Recursive Traversal of a Given Binary Tree
Spring Security and OpenID Connect
Getting the Size of an Iterable in Java
Java – Try with Resources
Guide to Selenium with JUnit / TestNG
Server-Sent Events in Spring
Java Program to Check Whether a Directed Graph Contains a Eulerian Path
Hướng dẫn Java Design Pattern – Composite
Queue và PriorityQueue trong Java
Spring Boot Gradle Plugin
Tránh lỗi ConcurrentModificationException trong Java như thế nào?
Java Program to Find the Connected Components of an UnDirected Graph
Java Program to Implement the MD5 Algorithm
TreeSet và sử dụng Comparable, Comparator trong java
Add Multiple Items to an Java ArrayList
Java Program to Check if a Point d lies Inside or Outside a Circle Defined by Points a, b, c in a Pl...
Comparing Strings in Java
Java Program to Construct a Random Graph by the Method of Random Edge Selection
Convert Character Array to String in Java
Quick Guide on Loading Initial Data with Spring Boot
Spring Boot - Sending Email
Giới thiệu Google Guice – Injection, Scope
Java Program to Implement Bresenham Line Algorithm
LIKE Queries in Spring JPA Repositories
Guide to @ConfigurationProperties in Spring Boot
Các chương trình minh họa sử dụng Cấu trúc điều khiển trong Java