How to zip two collections in Java? (#2176)

* How to zip two collections in Java?

How to zip two collections in Java? | http://jira.baeldung.com/browse/BAEL-780

* Updated pom to add jool dependency

* Added Unit Tests of Zip Collections

* Moved files to libraries folder

* Fixed Compilation Error

* Removed jool dependency as code has been moved to libraries

* Removed jool property attribute
This commit is contained in:
Devendra Tiwari 2017-07-09 01:50:49 +05:30 committed by Grzegorz Piwowarek
parent 57279a1b5c
commit 1957750382
4 changed files with 132 additions and 1 deletions

View File

@ -349,6 +349,12 @@
<artifactId>java-lsh</artifactId>
<version>${java-lsh.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
<dependency>
<groupId>au.com.dius</groupId>
<artifactId>pact-jvm-consumer-junit_2.11</artifactId>

View File

@ -0,0 +1,40 @@
package com.baeldung.zip;
import com.google.common.collect.Streams;
import org.jooq.lambda.Seq;
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
public class ZipCollectionExample {
static List<String> names = Arrays.asList("John", "Jane", "Jack", "Dennis");
static List<Integer> ages = Arrays.asList(24, 25, 27);
public static void main(String[] args) {
// Using Streams API from Guava 21
Streams
.zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
.forEach(System.out::println);
// Using native Java 8 Int Stream
IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
.forEach(System.out::println);
// Using jOOL
Seq
.of("John", "Jane", "Dennis")
.zip(Seq.of(24, 25, 27));
Seq
.of("John", "Jane", "Dennis")
.zip(Seq.of(24, 25, 27), (x, y) -> x + ":" + y);
Seq
.of("a", "b", "c")
.zipWithIndex();
}
}

View File

@ -0,0 +1,85 @@
package com.baeldung.zip;
import com.google.common.collect.Streams;
import org.jooq.lambda.Seq;
import org.jooq.lambda.tuple.Tuple2;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static org.junit.Assert.assertEquals;
public class ZipCollectionTest {
List<String> names;
List<Integer> ages;
List<String> expectedOutput;
@Before
public void setUp() throws Exception {
names = Arrays.asList("John", "Jane", "Jack", "Dennis");
ages = Arrays.asList(24, 25, 27);
expectedOutput = Arrays.asList("John:24", "Jane:25", "Jack:27");
}
@Test
public void zipCollectionUsingGuava21() {
List<String> output = Streams
.zip(names.stream(), ages.stream(), (name, age) -> name + ":" + age)
.collect(Collectors.toList());
assertEquals(output, expectedOutput);
}
@Test
public void zipCollectionUsingIntStream() {
List<String> output = IntStream
.range(0, Math.min(names.size(), ages.size()))
.mapToObj(i -> names.get(i) + ":" + ages.get(i))
.collect(Collectors.toList());
assertEquals(output, expectedOutput);
}
@Test
public void zipCollectionUsingJool() {
Seq<String> output = Seq
.of("John", "Jane", "Jack")
.zip(Seq.of(24, 25, 27), (x, y) -> x + ":" + y);
assertEquals(output.toList(), expectedOutput);
}
@Test
public void zipCollectionUsingJoolTuple() {
Seq<Tuple2<String, Integer>> output = Seq
.of("John", "Jane", "Dennis")
.zip(Seq.of(24, 25, 27));
Tuple2<String, Integer> element1 = new Tuple2<String, Integer>("John", 24);
Tuple2<String, Integer> element2 = new Tuple2<String, Integer>("Jane", 25);
Tuple2<String, Integer> element3 = new Tuple2<String, Integer>("Dennis", 27);
List<Tuple2> expectedOutput = Arrays.asList(element1, element2, element3);
assertEquals(output.collect(Collectors.toList()), expectedOutput);
}
@Test
public void zipCollectionUsingJoolWithIndex() {
Seq<Tuple2<String, Long>> output = Seq
.of("John", "Jane", "Dennis")
.zipWithIndex();
Tuple2<String, Long> element1 = new Tuple2<>("John", 0L);
Tuple2<String, Long> element2 = new Tuple2<>("Jane", 1L);
Tuple2<String, Long> element3 = new Tuple2<>("Dennis", 2L);
List<Tuple2> expectedOutput = Arrays.asList(element1, element2, element3);
assertEquals(output.collect(Collectors.toList()), expectedOutput);
}
}