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:

Hướng dẫn Java Design Pattern – Transfer Object
Setting the Java Version in Maven
HashSet trong Java hoạt động như thế nào?
Java Program to Implement Network Flow Problem
Spring Security Remember Me
Create Java Applet to Simulate Any Sorting Technique
Java Program to Implement Graph Coloring Algorithm
Java Program to Implement LinkedBlockingDeque API
Java Program to Search Number Using Divide and Conquer with the Aid of Fibonacci Numbers
Jackson – Marshall String to JsonNode
Java Program to Implement Euclid GCD Algorithm
Period and Duration in Java
Java Program to Implement PriorityQueue API
Java Program to Implement Find all Forward Edges in a Graph
ETL with Spring Cloud Data Flow
Java Program to Generate All Subsets of a Given Set in the Lexico Graphic Order
Java Program to Implement Iterative Deepening
Introduction to Project Reactor Bus
Java Program to implement Bit Matrix
Prevent Brute Force Authentication Attempts with Spring Security
Sử dụng JDBC API thực thi câu lệnh truy vấn dữ liệu
Java Program to Solve a Matching Problem for a Given Specific Case
Giới thiệu Google Guice – Aspect Oriented Programming (AOP)
Guide to Escaping Characters in Java RegExps
How to Store Duplicate Keys in a Map in Java?
Anonymous Classes in Java
Java Deep Learning Essentials - Yusuke Sugomori
Java Program to Implement Weight Balanced Tree
Một số nguyên tắc, định luật trong lập trình
Jackson Exceptions – Problems and Solutions
Hướng dẫn Java Design Pattern – MVC
Guide to CopyOnWriteArrayList