Skip to content

Commit 3484b62

Browse files
authored
BAEL-9176 Code and Unit Tests for Converting Nested Loops to Streams in Java (#18372)
- Added a new streams-7 module. - Implements the solution showcasing three use-cases: looping through all the elements, lopping through elements and using a filter, looping through elements and short-circuiting. - Provides unit tests for each of the implemented use-cases.
1 parent 25c0dc5 commit 3484b62

File tree

5 files changed

+163
-0
lines changed

5 files changed

+163
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
### Relevant Articles:
2+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<artifactId>core-java-streams-7</artifactId>
7+
<packaging>jar</packaging>
8+
<name>core-java-streams-7</name>
9+
10+
<parent>
11+
<groupId>com.baeldung.core-java-modules</groupId>
12+
<artifactId>core-java-modules</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
</parent>
15+
16+
<build>
17+
<finalName>core-java-streams-7</finalName>
18+
<resources>
19+
<resource>
20+
<directory>../core-java-streams-7/src/main</directory>
21+
<filtering>true</filtering>
22+
</resource>
23+
</resources>
24+
<plugins>
25+
<plugin>
26+
<groupId>org.apache.maven.plugins</groupId>
27+
<artifactId>maven-compiler-plugin</artifactId>
28+
<configuration>
29+
<source>${maven.compiler.source}</source>
30+
<target>${maven.compiler.target}</target>
31+
<compilerArgument>-parameters</compilerArgument>
32+
</configuration>
33+
</plugin>
34+
</plugins>
35+
</build>
36+
37+
<properties>
38+
<maven.compiler.source>12</maven.compiler.source>
39+
<maven.compiler.target>12</maven.compiler.target>
40+
<vavr.version>0.10.2</vavr.version>
41+
<assertj-core.version>3.23.1</assertj-core.version>
42+
<commons-lang3.version>3.12.0</commons-lang3.version>
43+
</properties>
44+
45+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.baeldung.streams;
2+
3+
import java.util.List;
4+
import java.util.ArrayList;
5+
import java.util.Optional;
6+
7+
import java.util.stream.Collectors;
8+
9+
public class NestedLoopsToStreamsConverter {
10+
11+
public static List<int[]> getAllPairsImperative(List<Integer> list1, List<Integer> list2) {
12+
List<int[]> pairs = new ArrayList<>();
13+
for (Integer num1 : list1) {
14+
for (Integer num2 : list2) {
15+
pairs.add(new int[] { num1, num2 });
16+
}
17+
}
18+
return pairs;
19+
}
20+
21+
public static List<int[]> getAllPairsStream(List<Integer> list1, List<Integer> list2) {
22+
return list1.stream()
23+
.flatMap(num1 -> list2.stream().map(num2 -> new int[] { num1, num2 }))
24+
.collect(Collectors.toList());
25+
}
26+
27+
public static List<int[]> getFilteredPairsImperative(List<Integer> list1, List<Integer> list2) {
28+
List<int[]> pairs = new ArrayList<>();
29+
for (Integer num1 : list1) {
30+
for (Integer num2 : list2) {
31+
if (num1 + num2 > 7) {
32+
pairs.add(new int[] { num1, num2 });
33+
}
34+
}
35+
}
36+
return pairs;
37+
}
38+
39+
public static List<int[]> getFilteredPairsStream(List<Integer> list1, List<Integer> list2) {
40+
return list1.stream()
41+
.flatMap(num1 -> list2.stream().map(num2 -> new int[] { num1, num2 }))
42+
.filter(pair -> pair[0] + pair[1] > 7)
43+
.collect(Collectors.toList());
44+
}
45+
46+
public static Optional<int[]> getFirstMatchingPairImperative(List<Integer> list1, List<Integer> list2) {
47+
for (Integer num1 : list1) {
48+
for (Integer num2 : list2) {
49+
if (num1 + num2 > 7) {
50+
return Optional.of(new int[] { num1, num2 });
51+
}
52+
}
53+
}
54+
return Optional.empty();
55+
}
56+
57+
public static Optional<int[]> getFirstMatchingPairStream(List<Integer> list1, List<Integer> list2) {
58+
return list1.stream()
59+
.flatMap(num1 -> list2.stream().map(num2 -> new int[] { num1, num2 }))
60+
.filter(pair -> pair[0] + pair[1] > 7)
61+
.findFirst();
62+
}
63+
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.baeldung.streams;
2+
3+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
4+
import static org.junit.Assert.assertEquals;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
import java.util.Optional;
9+
10+
import org.junit.Test;
11+
12+
public class NestedLoopsToStreamsConverterUnitTest {
13+
14+
@Test
15+
public void givenTwoLists_whenGeneratingAllPairs_thenResultsShouldMatch() {
16+
List<Integer> list1 = Arrays.asList(1, 2, 3);
17+
List<Integer> list2 = Arrays.asList(4, 5, 6);
18+
19+
List<int[]> imperativeResult = NestedLoopsToStreamsConverter.getAllPairsImperative(list1, list2);
20+
List<int[]> streamResult = NestedLoopsToStreamsConverter.getAllPairsStream(list1, list2);
21+
assertEquals(imperativeResult.size(), streamResult.size());
22+
for (int i = 0; i < imperativeResult.size(); i++) {
23+
assertArrayEquals(imperativeResult.get(i), streamResult.get(i));
24+
}
25+
}
26+
27+
@Test
28+
public void givenTwoLists_whenFilteringPairsBySum_thenResultsShouldMatch() {
29+
List<Integer> list1 = Arrays.asList(1, 2, 3);
30+
List<Integer> list2 = Arrays.asList(4, 5, 6);
31+
32+
List<int[]> imperativeResult = NestedLoopsToStreamsConverter.getFilteredPairsImperative(list1, list2);
33+
List<int[]> streamResult = NestedLoopsToStreamsConverter.getFilteredPairsStream(list1, list2);
34+
assertEquals(imperativeResult.size(), streamResult.size());
35+
for (int i = 0; i < imperativeResult.size(); i++) {
36+
assertArrayEquals(imperativeResult.get(i), streamResult.get(i));
37+
}
38+
}
39+
40+
@Test
41+
public void givenTwoLists_whenFindingFirstMatchingPair_thenResultsShouldMatch() {
42+
List<Integer> list1 = Arrays.asList(1, 2, 3);
43+
List<Integer> list2 = Arrays.asList(4, 5, 6);
44+
45+
Optional<int[]> imperativeResult = NestedLoopsToStreamsConverter.getFirstMatchingPairImperative(list1, list2);
46+
Optional<int[]> streamResult = NestedLoopsToStreamsConverter.getFirstMatchingPairStream(list1, list2);
47+
assertEquals(imperativeResult.isPresent(), streamResult.isPresent());
48+
imperativeResult.ifPresent(pair -> assertArrayEquals(pair, streamResult.get()));
49+
}
50+
51+
}

core-java-modules/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
<module>core-java-streams-4</module>
6262
<module>core-java-streams-5</module>
6363
<module>core-java-streams-6</module>
64+
<module>core-java-streams-7</module>
6465
<module>core-java-streams-collect</module>
6566
<module>core-java-streams-maps</module>
6667
<module>core-java-string-operations-3</module>

0 commit comments

Comments
 (0)