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:

Phương thức forEach() trong java 8
Java Program to Solve the 0-1 Knapsack Problem
So sánh HashMap và Hashtable trong Java
Java Convenience Factory Methods for Collections
Java Program to Implement the Alexander Bogomolny’s UnOrdered Permutation Algorithm for Elements Fro...
The Thread.join() Method in Java
Java Program to Remove the Edges in a Given Cyclic Graph such that its Linear Extension can be Found
Tạo chương trình Java đầu tiên sử dụng Eclipse
Giới thiệu SOAP UI và thực hiện test Web Service
Java Program to Perform Left Rotation on a Binary Search Tree
Java Program to Implement Min Heap
Java Web Services – Jersey JAX-RS – REST và sử dụng REST API testing tools với Postman
Java Program for Douglas-Peucker Algorithm Implementation
Introduction to Spring Cloud Rest Client with Netflix Ribbon
Hướng dẫn Java Design Pattern – MVC
Spring Security Registration – Resend Verification Email
Transaction Propagation and Isolation in Spring @Transactional
How to Remove the Last Character of a String?
Java Program to Implement ArrayBlockingQueue API
Filtering and Transforming Collections in Guava
Java Program to Implement Merge Sort Algorithm on Linked List
What is a POJO Class?
Redirect to Different Pages after Login with Spring Security
Lớp TreeMap trong Java
A Guide to Java 9 Modularity
The Registration Process With Spring Security
Java Program to Find Hamiltonian Cycle in an UnWeighted Graph
How to Break from Java Stream forEach
Hướng dẫn Java Design Pattern – Dependency Injection
Spring Boot - Internationalization
Java Program to Implement RoleList API
Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Conne...