From 410f83f104d3a61e70eec33417c5f02e3079d773 Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Fri, 14 Jul 2023 20:21:28 +0100 Subject: [PATCH 1/7] Updating JDK to 17 and GSON to 2.8.9 --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index cc299ae..62456e4 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,8 @@ org.apache.maven.plugins maven-compiler-plugin - 16 - 16 + 17 + 17 @@ -26,7 +26,7 @@ 31.0.1-jre 3.21.0 5.8.1 - 2.8.8 + 2.8.9 2.11.0 From 1a505c409d48edaafdaaed49809f2af8bff24b4f Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Sat, 15 Jul 2023 11:15:36 +0100 Subject: [PATCH 2/7] Count items in a stream after performing a few operations with streams --- .../examples/WorkingWithStreams.java | 16 ------------ .../examples/WorkingWithStreamsTest.java | 25 +++++++++++++++++++ 2 files changed, 25 insertions(+), 16 deletions(-) delete mode 100644 src/test/java/com/amigoscode/examples/WorkingWithStreams.java create mode 100644 src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java diff --git a/src/test/java/com/amigoscode/examples/WorkingWithStreams.java b/src/test/java/com/amigoscode/examples/WorkingWithStreams.java deleted file mode 100644 index 0818b7c..0000000 --- a/src/test/java/com/amigoscode/examples/WorkingWithStreams.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.amigoscode.examples; - -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -public class WorkingWithStreams { - - @Test - void steams() { - List names = List.of("Amigoscode", "Alex", "Zara"); - } -} diff --git a/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java b/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java new file mode 100644 index 0000000..392ddfd --- /dev/null +++ b/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java @@ -0,0 +1,25 @@ +package com.amigoscode.examples; + +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.stream.Stream; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class WorkingWithStreamsTest { + + @Test + void count_items_on_stream() { + var names = List.of("Amigoscode", "Alex", "Zara"); + var stream = names.stream(); + + var count = stream.limit(2) + .map(null) + .sorted(null) + .dropWhile(null) + .count(); + + assertThat(count).isEqualTo(2); + } +} From 90f62a10ec27525b7da1d413bf0fac9b8bc60416 Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Sat, 15 Jul 2023 11:30:21 +0100 Subject: [PATCH 3/7] FIXED broken test - Count items in a stream after performing a few operations with streams --- .../amigoscode/examples/WorkingWithStreamsTest.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java b/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java index 392ddfd..4ae31e2 100644 --- a/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java +++ b/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java @@ -3,7 +3,6 @@ import org.junit.jupiter.api.Test; import java.util.List; -import java.util.stream.Stream; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -11,13 +10,12 @@ class WorkingWithStreamsTest { @Test void count_items_on_stream() { - var names = List.of("Amigoscode", "Alex", "Zara"); + var names = List.of("Amigoscode", "Alex", "Zara", "Sarah", "Alan"); var stream = names.stream(); - var count = stream.limit(2) - .map(null) - .sorted(null) - .dropWhile(null) + var count = stream + .filter(name -> name.charAt(0) == 'A') + .limit(2) .count(); assertThat(count).isEqualTo(2); From 396b3b61e958dca2cf31136e90985fe3ce1bf135 Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Sat, 15 Jul 2023 11:53:19 +0100 Subject: [PATCH 4/7] Tests created and implemented for GettingStarted. There was refactoring after tests being green. This is where I extracted the implementations to its own class and methods, away from the test suite. The beans were moved away from the test suite, into the implementation package. --- .../java/com/amigoscode/beans/Car.java | 0 .../java/com/amigoscode/beans/Person.java | 0 .../java/com/amigoscode/beans/PersonDTO.java | 0 .../amigoscode/examples/GettingStarted.java | 38 +++++++++++++ .../amigoscode/examples/GettingStarted.java | 26 --------- .../examples/GettingStartedTest.java | 56 +++++++++++++++++++ 6 files changed, 94 insertions(+), 26 deletions(-) rename src/{test => main}/java/com/amigoscode/beans/Car.java (100%) rename src/{test => main}/java/com/amigoscode/beans/Person.java (100%) rename src/{test => main}/java/com/amigoscode/beans/PersonDTO.java (100%) create mode 100644 src/main/java/com/amigoscode/examples/GettingStarted.java delete mode 100644 src/test/java/com/amigoscode/examples/GettingStarted.java create mode 100644 src/test/java/com/amigoscode/examples/GettingStartedTest.java diff --git a/src/test/java/com/amigoscode/beans/Car.java b/src/main/java/com/amigoscode/beans/Car.java similarity index 100% rename from src/test/java/com/amigoscode/beans/Car.java rename to src/main/java/com/amigoscode/beans/Car.java diff --git a/src/test/java/com/amigoscode/beans/Person.java b/src/main/java/com/amigoscode/beans/Person.java similarity index 100% rename from src/test/java/com/amigoscode/beans/Person.java rename to src/main/java/com/amigoscode/beans/Person.java diff --git a/src/test/java/com/amigoscode/beans/PersonDTO.java b/src/main/java/com/amigoscode/beans/PersonDTO.java similarity index 100% rename from src/test/java/com/amigoscode/beans/PersonDTO.java rename to src/main/java/com/amigoscode/beans/PersonDTO.java diff --git a/src/main/java/com/amigoscode/examples/GettingStarted.java b/src/main/java/com/amigoscode/examples/GettingStarted.java new file mode 100644 index 0000000..0d8cbb3 --- /dev/null +++ b/src/main/java/com/amigoscode/examples/GettingStarted.java @@ -0,0 +1,38 @@ +package com.amigoscode.examples; + +import com.amigoscode.beans.Person; + +import java.util.ArrayList; +import java.util.List; + +class GettingStarted { + + private final List people; + + GettingStarted(List people) { + this.people = people; + } + + List imperativeApproach() { + var youngPeople = new ArrayList(); + var limit = 10; + var counter = 0; + for (Person person : people) { + if (person.getAge() <= 18) { + youngPeople.add(person); + counter++; + } + if (counter == limit) { + break; + } + } + return youngPeople; + } + + List declarativeApproachUsingStreams() { + return people.stream() + .filter(person -> person.getAge() <= 18) + .limit(10) + .toList(); + } +} diff --git a/src/test/java/com/amigoscode/examples/GettingStarted.java b/src/test/java/com/amigoscode/examples/GettingStarted.java deleted file mode 100644 index 94a5f49..0000000 --- a/src/test/java/com/amigoscode/examples/GettingStarted.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.amigoscode.examples; - -import com.amigoscode.beans.Person; -import com.amigoscode.mockdata.MockData; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - - -public class GettingStarted { - - @Test - public void imperativeApproach() throws IOException { - // 1. Find people aged less or equal 18 - // 2. Then change implementation to find first 10 people - List people = MockData.getPeople(); - } - - @Test - public void declarativeApproachUsingStreams() throws Exception { - List people = MockData.getPeople(); - } -} diff --git a/src/test/java/com/amigoscode/examples/GettingStartedTest.java b/src/test/java/com/amigoscode/examples/GettingStartedTest.java new file mode 100644 index 0000000..0f3555e --- /dev/null +++ b/src/test/java/com/amigoscode/examples/GettingStartedTest.java @@ -0,0 +1,56 @@ +package com.amigoscode.examples; + +import com.amigoscode.beans.Person; +import com.amigoscode.mockdata.MockData; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.fail; + + +class GettingStartedTest { + + private static final String FAILED_TO_FETCH_MOCK_DATA_FOR_THE_TEST = "Failed to fetch mock data for the test"; + private GettingStarted gettingStarted; + private List people; + + @BeforeEach + void setup() { + try { + people = MockData.getPeople(); + } catch (IOException e) { + fail(FAILED_TO_FETCH_MOCK_DATA_FOR_THE_TEST); + } + gettingStarted = new GettingStarted(people); + } + + @Test + void imperative_approach() { + // 1. Find people aged less or equal 18 + // 2. Then change implementation to find first 10 people + + var youngPeople = gettingStarted.imperativeApproach(); + + assertThat(youngPeople.size()).isEqualTo(10); + for (Person person : youngPeople) { + assertThat(person.getAge()).isLessThanOrEqualTo(18); + } + } + + @Test + void declarativeApproachUsingStreams() { + // 1. Find people aged less or equal 18 + // 2. Then change implementation to find first 10 people + + var youngPeople = gettingStarted.declarativeApproachUsingStreams(); + + assertThat(youngPeople.size()).isEqualTo(10); + for (Person person : youngPeople) { + assertThat(person.getAge()).isLessThanOrEqualTo(18); + } + } +} From 779f17d0d2cfeab68501dabb94b787f776750d10 Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Sat, 15 Jul 2023 12:07:11 +0100 Subject: [PATCH 5/7] Get all yellow cars under 20k --- .../{Filtering.java => FilteringTest.java} | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) rename src/test/java/com/amigoscode/examples/{Filtering.java => FilteringTest.java} (55%) diff --git a/src/test/java/com/amigoscode/examples/Filtering.java b/src/test/java/com/amigoscode/examples/FilteringTest.java similarity index 55% rename from src/test/java/com/amigoscode/examples/Filtering.java rename to src/test/java/com/amigoscode/examples/FilteringTest.java index 0037437..4a4ee8e 100644 --- a/src/test/java/com/amigoscode/examples/Filtering.java +++ b/src/test/java/com/amigoscode/examples/FilteringTest.java @@ -1,26 +1,35 @@ package com.amigoscode.examples; import com.amigoscode.beans.Car; -import com.amigoscode.beans.Person; import com.amigoscode.mockdata.MockData; import org.junit.jupiter.api.Test; -import java.util.Arrays; -import java.util.List; -import java.util.OptionalInt; import java.util.function.Predicate; -import java.util.stream.Collectors; import java.util.stream.Stream; -public class Filtering { +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class FilteringTest { @Test - public void filter() throws Exception { - List cars = MockData.getCars(); + void get_all_yellow_cars_under_20k() throws Exception { + var cars = MockData.getCars(); + + Predicate price = car -> car.getPrice() < 20_000.00; + Predicate color = car -> car.getColor().equals("Yellow"); + + var carsUnder20k = cars.stream() + .filter(price) + .filter(color) + .toList(); + + assertThat(carsUnder20k.size()).isEqualTo(9); + carsUnder20k.forEach(car -> + assertThat(car.getPrice()).isLessThan(20_000.00)); } @Test - public void dropWhile() throws Exception { + void dropWhile() throws Exception { System.out.println("using filter"); Stream.of(2, 4, 6, 8, 9, 10, 12).filter(n -> n % 2 == 0) .forEach(n -> System.out.print(n + " ")); @@ -29,7 +38,7 @@ public void dropWhile() throws Exception { } @Test - public void takeWhile() throws Exception { + void takeWhile() throws Exception { // using filter System.out.println("using filter"); Stream.of(2, 4, 6, 8, 9, 10, 12).filter(n -> n % 2 == 0) @@ -40,22 +49,22 @@ public void takeWhile() throws Exception { } @Test - public void findFirst() throws Exception { + void findFirst() throws Exception { int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; } @Test - public void findAny() throws Exception { + void findAny() throws Exception { int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10}; } @Test - public void allMatch() throws Exception { + void allMatch() throws Exception { int[] even = {2, 4, 6, 8, 10}; } @Test - public void anyMatch() throws Exception { + void anyMatch() throws Exception { int[] evenAndOneOdd = {2, 4, 6, 8, 10, 11}; } From 2c8c2cac878080492aeb937426c7496ffa7c11de Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Sat, 15 Jul 2023 12:14:10 +0100 Subject: [PATCH 6/7] Get all yellow cars under 20k functionality has now been refactored. Implementation has now been extracted to its own implementation class. --- .../com/amigoscode/examples/Filtering.java | 24 +++++++++++++++++++ .../amigoscode/examples/FilteringTest.java | 17 ++++--------- 2 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/amigoscode/examples/Filtering.java diff --git a/src/main/java/com/amigoscode/examples/Filtering.java b/src/main/java/com/amigoscode/examples/Filtering.java new file mode 100644 index 0000000..7dfdad0 --- /dev/null +++ b/src/main/java/com/amigoscode/examples/Filtering.java @@ -0,0 +1,24 @@ +package com.amigoscode.examples; + +import com.amigoscode.beans.Car; + +import java.util.List; +import java.util.function.Predicate; + +class Filtering { + + private final Predicate price = car -> car.getPrice() < 20_000.00; + private final Predicate color = car -> car.getColor().equals("Yellow"); + private final List cars; + + Filtering(List cars) { + this.cars = cars; + } + + List getYellowCarsUnder20k() { + return cars.stream() + .filter(price) + .filter(color) + .toList(); + } +} \ No newline at end of file diff --git a/src/test/java/com/amigoscode/examples/FilteringTest.java b/src/test/java/com/amigoscode/examples/FilteringTest.java index 4a4ee8e..7c0fc2e 100644 --- a/src/test/java/com/amigoscode/examples/FilteringTest.java +++ b/src/test/java/com/amigoscode/examples/FilteringTest.java @@ -1,10 +1,8 @@ package com.amigoscode.examples; -import com.amigoscode.beans.Car; import com.amigoscode.mockdata.MockData; import org.junit.jupiter.api.Test; -import java.util.function.Predicate; import java.util.stream.Stream; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @@ -14,14 +12,9 @@ class FilteringTest { @Test void get_all_yellow_cars_under_20k() throws Exception { var cars = MockData.getCars(); + var filtering = new Filtering(cars); - Predicate price = car -> car.getPrice() < 20_000.00; - Predicate color = car -> car.getColor().equals("Yellow"); - - var carsUnder20k = cars.stream() - .filter(price) - .filter(color) - .toList(); + var carsUnder20k = filtering.getYellowCarsUnder20k(); assertThat(carsUnder20k.size()).isEqualTo(9); carsUnder20k.forEach(car -> @@ -30,7 +23,7 @@ void get_all_yellow_cars_under_20k() throws Exception { @Test void dropWhile() throws Exception { - System.out.println("using filter"); + System.out.println("using filtering"); Stream.of(2, 4, 6, 8, 9, 10, 12).filter(n -> n % 2 == 0) .forEach(n -> System.out.print(n + " ")); System.out.println(); @@ -39,8 +32,8 @@ void dropWhile() throws Exception { @Test void takeWhile() throws Exception { - // using filter - System.out.println("using filter"); + // using filtering + System.out.println("using filtering"); Stream.of(2, 4, 6, 8, 9, 10, 12).filter(n -> n % 2 == 0) .forEach(n -> System.out.print(n + " ")); From 96f891d9f1cc41b3fc485200eaa2eba57d488f63 Mon Sep 17 00:00:00 2001 From: Sylvester Loreto Date: Sat, 15 Jul 2023 14:57:27 +0100 Subject: [PATCH 7/7] Transformations map and reduce on streams --- .../examples/TransformationsMapAndReduce.java | 32 ----------- .../TransformationsMapAndReduceTest.java | 56 +++++++++++++++++++ 2 files changed, 56 insertions(+), 32 deletions(-) delete mode 100644 src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java create mode 100644 src/test/java/com/amigoscode/examples/TransformationsMapAndReduceTest.java diff --git a/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java b/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java deleted file mode 100644 index 4d6b267..0000000 --- a/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.amigoscode.examples; - -import com.amigoscode.beans.Car; -import com.amigoscode.beans.Person; -import com.amigoscode.beans.PersonDTO; -import com.amigoscode.mockdata.MockData; -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; - -public class TransformationsMapAndReduce { - - @Test - void yourFirstTransformationWithMap() throws IOException { - List people = MockData.getPeople(); - } - - @Test - void mapToDoubleAndFindAverageCarPrice() throws IOException { - List cars = MockData.getCars(); - } - - @Test - public void reduce() { - int[] integers = {1, 2, 3, 4, 99, 100, 121, 1302, 199}; - } -} - diff --git a/src/test/java/com/amigoscode/examples/TransformationsMapAndReduceTest.java b/src/test/java/com/amigoscode/examples/TransformationsMapAndReduceTest.java new file mode 100644 index 0000000..6d0783a --- /dev/null +++ b/src/test/java/com/amigoscode/examples/TransformationsMapAndReduceTest.java @@ -0,0 +1,56 @@ +package com.amigoscode.examples; + +import com.amigoscode.beans.Car; +import com.amigoscode.beans.Person; +import com.amigoscode.beans.PersonDTO; +import com.amigoscode.mockdata.MockData; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class TransformationsMapAndReduceTest { + + @Test + void yourFirstTransformationWithMap() throws IOException { + List people = MockData.getPeople(); + + var peopleDTos = people.stream() + .map(PersonDTO::map) + .toList(); + + assertThat(people.size()).isEqualTo(peopleDTos.size()); + peopleDTos.forEach(personDTO -> { + long count = people.stream() + .filter(person -> person.getId() == personDTO.getId()) + .count(); + assertThat(count).isEqualTo(1); + }); + } + + @Test + void mapToDoubleAndFindAverageCarPrice() throws IOException { + var cars = MockData.getCars(); + + double averageCarPrice = cars.stream() + .mapToDouble(Car::getPrice) + .average() + .getAsDouble(); + + assertThat(averageCarPrice).isEqualTo(52693.19979); + } + + @Test + void reduce() { + int[] integers = {1, 2, 3, 4, 99, 100, 121, 1302, 199}; + + var reduced = Arrays.stream(integers) + .reduce(0, Integer::sum); + + assertThat(reduced).isEqualTo(1831); + } +} +