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 Implement an Algorithm to Find the Global min Cut in a Graph
Java Program to Implement a Binary Search Tree using Linked Lists
Spring – Injecting Collections
Java Program to Perform Finite State Automaton based Search
Spring MVC Tutorial
Java Program to find the number of occurrences of a given number using Binary Search approach
How to Remove the Last Character of a String?
Java Program to Implement Wagner and Fisher Algorithm for online String Matching
Hướng dẫn sử dụng Java Generics
Request a Delivery / Read Receipt in Javamail
Java Program to Represent Graph Using Linked List
Java Program to Find Whether a Path Exists Between 2 Given Nodes
Java Program to Find Strongly Connected Components in Graphs
Java Program to Implement K Way Merge Algorithm
Prevent Cross-Site Scripting (XSS) in a Spring Application
Documenting a Spring REST API Using OpenAPI 3.0
Java Program to Implement Attribute API
Java Program to Implement Queue using Two Stacks
Java Program to Compute Discrete Fourier Transform Using the Fast Fourier Transform Approach
Java InputStream to String
Java Program to Generate Date Between Given Range
Java Program to Implement TreeSet API
Introduction to the Java NIO Selector
Java Program to Check if any Graph is Possible to be Constructed for a Given Degree Sequence
Java Program to Implement PriorityBlockingQueue API
RegEx for matching Date Pattern in Java
Spring Security – Reset Your Password
Creating a Web Application with Spring 5
Introduction to Spring Data JDBC
Java Program for Topological Sorting in Graphs
Java Program to Implement Coppersmith Freivald’s Algorithm
So sánh HashSet, LinkedHashSet và TreeSet trong Java