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 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/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/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/Filtering.java b/src/test/java/com/amigoscode/examples/FilteringTest.java similarity index 51% rename from src/test/java/com/amigoscode/examples/Filtering.java rename to src/test/java/com/amigoscode/examples/FilteringTest.java index 0037437..7c0fc2e 100644 --- a/src/test/java/com/amigoscode/examples/Filtering.java +++ b/src/test/java/com/amigoscode/examples/FilteringTest.java @@ -1,27 +1,29 @@ 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(); + var filtering = new Filtering(cars); + + var carsUnder20k = filtering.getYellowCarsUnder20k(); + + assertThat(carsUnder20k.size()).isEqualTo(9); + carsUnder20k.forEach(car -> + assertThat(car.getPrice()).isLessThan(20_000.00)); } @Test - public void dropWhile() throws Exception { - System.out.println("using filter"); + void dropWhile() throws Exception { + 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(); @@ -29,9 +31,9 @@ public void dropWhile() throws Exception { } @Test - public void takeWhile() throws Exception { - // using filter - System.out.println("using filter"); + void takeWhile() throws Exception { + // 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 + " ")); @@ -40,22 +42,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}; } 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); + } + } +} 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); + } +} + 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..4ae31e2 --- /dev/null +++ b/src/test/java/com/amigoscode/examples/WorkingWithStreamsTest.java @@ -0,0 +1,23 @@ +package com.amigoscode.examples; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class WorkingWithStreamsTest { + + @Test + void count_items_on_stream() { + var names = List.of("Amigoscode", "Alex", "Zara", "Sarah", "Alan"); + var stream = names.stream(); + + var count = stream + .filter(name -> name.charAt(0) == 'A') + .limit(2) + .count(); + + assertThat(count).isEqualTo(2); + } +}