diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/streams/NestedLoopsToStreamsConverter.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/streams/NestedLoopsToStreamsConverter.java new file mode 100644 index 000000000000..17341d852bab --- /dev/null +++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/streams/NestedLoopsToStreamsConverter.java @@ -0,0 +1,64 @@ +package com.baeldung.streams; + +import java.util.List; +import java.util.ArrayList; +import java.util.Optional; + +import java.util.stream.Collectors; + +public class NestedLoopsToStreamsConverter { + + public static List getAllPairsImperative(List list1, List list2) { + List pairs = new ArrayList<>(); + for (Integer num1 : list1) { + for (Integer num2 : list2) { + pairs.add(new int[] { num1, num2 }); + } + } + return pairs; + } + + public static List getAllPairsStream(List list1, List list2) { + return list1.stream() + .flatMap(num1 -> list2.stream().map(num2 -> new int[] { num1, num2 })) + .collect(Collectors.toList()); + } + + public static List getFilteredPairsImperative(List list1, List list2) { + List pairs = new ArrayList<>(); + for (Integer num1 : list1) { + for (Integer num2 : list2) { + if (num1 + num2 > 7) { + pairs.add(new int[] { num1, num2 }); + } + } + } + return pairs; + } + + public static List getFilteredPairsStream(List list1, List list2) { + return list1.stream() + .flatMap(num1 -> list2.stream().map(num2 -> new int[] { num1, num2 })) + .filter(pair -> pair[0] + pair[1] > 7) + .collect(Collectors.toList()); + } + + public static Optional getFirstMatchingPairImperative(List list1, List list2) { + for (Integer num1 : list1) { + for (Integer num2 : list2) { + if (num1 + num2 > 7) { + return Optional.of(new int[] { num1, num2 }); + } + } + } + return Optional.empty(); + } + + public static Optional getFirstMatchingPairStream(List list1, List list2) { + return list1.stream() + .flatMap(num1 -> list2.stream().map(num2 -> new int[] { num1, num2 })) + .filter(pair -> pair[0] + pair[1] > 7) + .findFirst(); + } + +} diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/NestedLoopsToStreamsConverterUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/NestedLoopsToStreamsConverterUnitTest.java new file mode 100644 index 000000000000..a1450f65226c --- /dev/null +++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/NestedLoopsToStreamsConverterUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.streams; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import org.junit.Test; + +public class NestedLoopsToStreamsConverterUnitTest { + + @Test + public void givenTwoLists_whenGeneratingAllPairs_thenResultsShouldMatch() { + List list1 = Arrays.asList(1, 2, 3); + List list2 = Arrays.asList(4, 5, 6); + + List imperativeResult = NestedLoopsToStreamsConverter.getAllPairsImperative(list1, list2); + List streamResult = NestedLoopsToStreamsConverter.getAllPairsStream(list1, list2); + assertEquals(imperativeResult.size(), streamResult.size()); + for (int i = 0; i < imperativeResult.size(); i++) { + assertArrayEquals(imperativeResult.get(i), streamResult.get(i)); + } + } + + @Test + public void givenTwoLists_whenFilteringPairsBySum_thenResultsShouldMatch() { + List list1 = Arrays.asList(1, 2, 3); + List list2 = Arrays.asList(4, 5, 6); + + List imperativeResult = NestedLoopsToStreamsConverter.getFilteredPairsImperative(list1, list2); + List streamResult = NestedLoopsToStreamsConverter.getFilteredPairsStream(list1, list2); + assertEquals(imperativeResult.size(), streamResult.size()); + for (int i = 0; i < imperativeResult.size(); i++) { + assertArrayEquals(imperativeResult.get(i), streamResult.get(i)); + } + } + + @Test + public void givenTwoLists_whenFindingFirstMatchingPair_thenResultsShouldMatch() { + List list1 = Arrays.asList(1, 2, 3); + List list2 = Arrays.asList(4, 5, 6); + + Optional imperativeResult = NestedLoopsToStreamsConverter.getFirstMatchingPairImperative(list1, list2); + Optional streamResult = NestedLoopsToStreamsConverter.getFirstMatchingPairStream(list1, list2); + assertEquals(imperativeResult.isPresent(), streamResult.isPresent()); + imperativeResult.ifPresent(pair -> assertArrayEquals(pair, streamResult.get())); + } + +}