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:

Guide to WeakHashMap in Java
Java Program to Implement Gabow Algorithm
Servlet 3 Async Support with Spring MVC and Spring Security
Injecting Prototype Beans into a Singleton Instance in Spring
Collect a Java Stream to an Immutable Collection
Reversing a Linked List in Java
Automatic Property Expansion with Spring Boot
Java Program to Implement Regular Falsi Algorithm
Java Program to Implement a Binary Search Tree using Linked Lists
Updating your Password
Anonymous Classes in Java
Java Program to Implement Branch and Bound Method to Perform a Combinatorial Search
Java Program to Implement LinkedBlockingDeque API
Java Program to Perform the Unique Factorization of a Given Number
Spring Boot - Batch Service
Java Program to Implement TreeSet API
Spring REST API + OAuth2 + Angular (using the Spring Security OAuth legacy stack)
Java Program to Apply DFS to Perform the Topological Sorting of a Directed Acyclic Graph
Java Program to Implement CopyOnWriteArraySet API
Java Program to Check Whether an Undirected Graph Contains a Eulerian Path
Java Program to Implement Network Flow Problem
How to Remove the Last Character of a String?
Apache Commons Collections MapUtils
Java – InputStream to Reader
Simple Single Sign-On with Spring Security OAuth2
Java Program to Implement Self organizing List
Spring Cloud – Securing Services
Spring MVC and the @ModelAttribute Annotation
Hướng dẫn Java Design Pattern – Flyweight
Một số ký tự đặc biệt trong Java
New Features in Java 9
Spring Data MongoDB – Indexes, Annotations and Converters