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:

Multi Dimensional ArrayList in Java
Java Program to implement Associate Array
Java Program to Implement Suffix Tree
Java Collections Interview Questions
The Order of Tests in JUnit
Introduction to Spring Cloud OpenFeign
Java Program to Generate Date Between Given Range
Query Entities by Dates and Times with Spring Data JPA
Lớp Collections trong Java (Collections Utility Class)
Lập trình hướng đối tượng (OOPs) trong java
How to Read a File in Java
Guide to the Java Clock Class
Java Program to Generate All Possible Subsets with Exactly k Elements in Each Subset
A Guide to HashSet in Java
Custom Cascading in Spring Data MongoDB
Giới thiệu Json Web Token (JWT)
Hướng dẫn Java Design Pattern – Service Locator
Spring Boot Annotations
Injecting Prototype Beans into a Singleton Instance in Spring
Java Program to Implement K Way Merge Algorithm
Java Program to Implement ConcurrentHashMap API
Java Program to Implement Jarvis Algorithm
Java Program to Implement Booth Algorithm
Java Program to Search Number Using Divide and Conquer with the Aid of Fibonacci Numbers
Java Program for Douglas-Peucker Algorithm Implementation
Java Program to Implement Double Ended Queue
Java Program to Implement LinkedTransferQueue API
Weak References in Java
Spring WebClient Filters
Java Program to Find MST (Minimum Spanning Tree) using Prim’s Algorithm
Java Program to Construct a Random Graph by the Method of Random Edge Selection
Java Program to Check Whether it is Weakly Connected or Strongly Connected for a Directed Graph