From 853aa4a7be66664a4678258cde20eebe90bde1d9 Mon Sep 17 00:00:00 2001 From: amigoscode Date: Sat, 16 Oct 2021 23:48:26 +0100 Subject: [PATCH 1/3] start --- .../amigoscode/examples/DistinctAndSets.java | 6 ---- .../com/amigoscode/examples/Filtering.java | 28 ---------------- .../amigoscode/examples/GettingStarted.java | 19 ----------- .../com/amigoscode/examples/GroupingData.java | 19 +---------- .../com/amigoscode/examples/IntStreams.java | 16 ---------- .../amigoscode/examples/JoiningStrings.java | 14 -------- .../java/com/amigoscode/examples/MinMax.java | 4 --- .../java/com/amigoscode/examples/Sorting.java | 27 ---------------- .../examples/StatisticsWithStreams.java | 32 ------------------- .../examples/TransformationsMapAndReduce.java | 23 ------------- .../examples/TransformationsWithFlatMap.java | 14 -------- .../examples/WorkingWithStreams.java | 10 ------ 12 files changed, 1 insertion(+), 211 deletions(-) diff --git a/src/test/java/com/amigoscode/examples/DistinctAndSets.java b/src/test/java/com/amigoscode/examples/DistinctAndSets.java index d235b2a..49d8cf7 100644 --- a/src/test/java/com/amigoscode/examples/DistinctAndSets.java +++ b/src/test/java/com/amigoscode/examples/DistinctAndSets.java @@ -14,16 +14,10 @@ public class DistinctAndSets { @Test public void distinct() throws Exception { List numbers = List.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9); - List distinct = numbers.stream().distinct().collect(Collectors.toList()); - assertThat(distinct).hasSize(9); - System.out.println(distinct); } @Test public void distinctWithSet() throws Exception { List numbers = List.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9); - Set distinct = numbers.stream().collect(Collectors.toSet()); - assertThat(distinct).hasSize(9); - System.out.println(distinct); } } diff --git a/src/test/java/com/amigoscode/examples/Filtering.java b/src/test/java/com/amigoscode/examples/Filtering.java index 4c23288..0037437 100644 --- a/src/test/java/com/amigoscode/examples/Filtering.java +++ b/src/test/java/com/amigoscode/examples/Filtering.java @@ -17,16 +17,6 @@ public class Filtering { @Test public void filter() throws Exception { List cars = MockData.getCars(); - - Predicate carPredicate = car -> car.getPrice() < 20_000.00; - Predicate yellow = car -> car.getColor().equals("Yellow"); - - List carsLessThan20k = cars.stream() - .filter(carPredicate) - .filter(yellow) - .collect(Collectors.toList()); - - carsLessThan20k.forEach(System.out::println); } @Test @@ -36,9 +26,6 @@ public void dropWhile() throws Exception { .forEach(n -> System.out.print(n + " ")); System.out.println(); System.out.println("using dropWhile"); - Stream.of(2, 4, 6, 8, 9, 10, 12).dropWhile(n -> n % 2 == 0) - .forEach(n -> System.out.print(n + " ")); - } @Test @@ -50,41 +37,26 @@ public void takeWhile() throws Exception { System.out.println(); System.out.println("using take while"); - Stream.of(2, 4, 6, 8, 9, 10, 12).takeWhile(n -> n % 2 == 0) - .forEach(n -> System.out.print(n + " ")); } @Test public void findFirst() throws Exception { int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; - int result = Arrays.stream(numbers).filter(n -> n == 50) - .findFirst() - .orElse(-1); - System.out.println(result); - } @Test public void findAny() throws Exception { int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10}; - int result = Arrays.stream(numbers).filter(n -> n == 9) - .findAny() - .orElse(-1); - System.out.println(result); } @Test public void allMatch() throws Exception { int[] even = {2, 4, 6, 8, 10}; - boolean allMatch = Arrays.stream(even).allMatch(n -> n % 2 == 0); - System.out.println(allMatch); } @Test public void anyMatch() throws Exception { int[] evenAndOneOdd = {2, 4, 6, 8, 10, 11}; - boolean anyMatch = Arrays.stream(evenAndOneOdd).anyMatch(n -> !(n % 2 == 0)); - System.out.println(anyMatch); } } diff --git a/src/test/java/com/amigoscode/examples/GettingStarted.java b/src/test/java/com/amigoscode/examples/GettingStarted.java index 04e626a..94a5f49 100644 --- a/src/test/java/com/amigoscode/examples/GettingStarted.java +++ b/src/test/java/com/amigoscode/examples/GettingStarted.java @@ -17,29 +17,10 @@ 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(); - List youngPeople = new ArrayList<>(); - int limit = 10; - int counter = 0; - for (Person person : people) { - if (person.getAge() <= 18) { - youngPeople.add(person); - counter++; - if (counter == limit) { - break; - } - } - } - youngPeople.forEach(System.out::println); - } @Test public void declarativeApproachUsingStreams() throws Exception { List people = MockData.getPeople(); - List youngPeople = people.stream() - .filter(p -> p.getAge() <= 18) - .limit(10) - .collect(Collectors.toList()); - youngPeople.forEach(System.out::println); } } diff --git a/src/test/java/com/amigoscode/examples/GroupingData.java b/src/test/java/com/amigoscode/examples/GroupingData.java index 502e083..8d956d7 100644 --- a/src/test/java/com/amigoscode/examples/GroupingData.java +++ b/src/test/java/com/amigoscode/examples/GroupingData.java @@ -14,15 +14,7 @@ public class GroupingData { @Test public void simpleGrouping() throws Exception { - Map> map = MockData.getCars() - .stream() - .collect(Collectors.groupingBy(Car::getMake)); - map.forEach((s, cars) -> { - System.out.println("Make " + s); - cars.forEach(System.out::println); - System.out.println("---------------------"); - }); - + List cars = MockData.getCars(); } @Test @@ -38,15 +30,6 @@ public void groupingAndCounting() throws Exception { "Alex", "Alex" ); - - Map map = names.stream() - .collect(Collectors.groupingBy( - Function.identity(), - Collectors.counting()) - ); - - System.out.println(map); - } } \ No newline at end of file diff --git a/src/test/java/com/amigoscode/examples/IntStreams.java b/src/test/java/com/amigoscode/examples/IntStreams.java index 07f0b16..51f00da 100644 --- a/src/test/java/com/amigoscode/examples/IntStreams.java +++ b/src/test/java/com/amigoscode/examples/IntStreams.java @@ -13,31 +13,15 @@ public class IntStreams { @Test public void range() throws Exception { - System.out.println("with fori"); - for (int i = 0; i <= 10; i++) { - System.out.println(i); - } - System.out.println("with int stream exclusive"); - IntStream.range(0, 10).forEach(System.out::println); - - System.out.println("with int stream inclusive"); - IntStream.rangeClosed(0, 10).forEach(System.out::println); } // Loop through people using IntStream @Test public void rangeIteratingLists() throws Exception { List people = MockData.getPeople(); - IntStream.range(0, people.size()) - .forEach(index -> { - System.out.println(people.get(index)); - }); } @Test public void intStreamIterate() { - IntStream.iterate(0, value -> value + 1) - .limit(11) - .forEach(System.out::println); } } diff --git a/src/test/java/com/amigoscode/examples/JoiningStrings.java b/src/test/java/com/amigoscode/examples/JoiningStrings.java index 77f7e94..ea1dc9d 100644 --- a/src/test/java/com/amigoscode/examples/JoiningStrings.java +++ b/src/test/java/com/amigoscode/examples/JoiningStrings.java @@ -11,26 +11,12 @@ public class JoiningStrings { public void joiningStrings() throws Exception { List names = List.of("anna", "john", "marcos", "helena", "yasmin"); // "Anna, John, Marcos, Helena, Yasmin" - StringBuilder join = new StringBuilder(); - - for (String name : names) { - join.append(name.substring(0, 1).toUpperCase()) - .append(name.substring(1)) - .append(", "); - } - - System.out.println(join); - System.out.println(join.substring(0, join.length() - 2)); } @Test public void joiningStringsWithStream() throws Exception { List names = List.of("anna", "john", "marcos", "helena", "yasmin"); // "Anna, John, Marcos, Helena, Yasmin" - String join = names.stream() - .map(name -> name.substring(0, 1).toUpperCase() + name.substring(1)) - .collect(Collectors.joining("|")); - System.out.println(join); } diff --git a/src/test/java/com/amigoscode/examples/MinMax.java b/src/test/java/com/amigoscode/examples/MinMax.java index ffadeda..2b43038 100644 --- a/src/test/java/com/amigoscode/examples/MinMax.java +++ b/src/test/java/com/amigoscode/examples/MinMax.java @@ -10,14 +10,10 @@ public class MinMax { @Test public void min() { List numbers = List.of(1, 2, 3, 100, 23, 93, 99); - Integer min = numbers.stream().min(Comparator.naturalOrder()).get(); - System.out.println(min); } @Test public void max() { List numbers = List.of(1, 2, 3, 100, 23, 93, 99); - Integer max = numbers.stream().max(Comparator.naturalOrder()).get(); - System.out.println(max); } } diff --git a/src/test/java/com/amigoscode/examples/Sorting.java b/src/test/java/com/amigoscode/examples/Sorting.java index c5e41c5..f7f642e 100644 --- a/src/test/java/com/amigoscode/examples/Sorting.java +++ b/src/test/java/com/amigoscode/examples/Sorting.java @@ -15,48 +15,21 @@ public class Sorting { @Test public void sortingSteamOfElements() throws IOException { List people = MockData.getPeople(); - List sorted = people.stream() - .map(Person::getFirstName) - .sorted() - .collect(Collectors.toList()); - sorted.forEach(System.out::println); } @Test public void sortingSteamOfElementsReverse() throws IOException { List people = MockData.getPeople(); - - List sorted = people.stream() - .map(Person::getFirstName) - .sorted(Comparator.reverseOrder()) - .collect(Collectors.toList()); - sorted.forEach(System.out::println); } @Test public void sortingSteamOfObjets() throws IOException { List people = MockData.getPeople(); - - Comparator comparing = Comparator - .comparing(Person::getEmail) - .reversed() - .thenComparing(Person::getFirstName); - - List sort = people.stream() - .sorted(comparing) - .collect(Collectors.toList()); - sort.forEach(System.out::println); } @Test public void topTenMostExpensiveBlueCars() throws IOException { List cars = MockData.getCars(); - List topTen = cars.stream() - .filter(car -> car.getColor().equalsIgnoreCase("blue")) - .sorted(Comparator.comparing(Car::getPrice).reversed()) - .limit(10) - .collect(Collectors.toList()); - topTen.forEach(System.out::println); } } diff --git a/src/test/java/com/amigoscode/examples/StatisticsWithStreams.java b/src/test/java/com/amigoscode/examples/StatisticsWithStreams.java index 66a6332..2e6c2f0 100644 --- a/src/test/java/com/amigoscode/examples/StatisticsWithStreams.java +++ b/src/test/java/com/amigoscode/examples/StatisticsWithStreams.java @@ -14,64 +14,32 @@ public class StatisticsWithStreams { @Test public void count() throws Exception { List cars = MockData.getCars(); - long count = cars.stream() - .filter(car -> car.getMake().equalsIgnoreCase("Ford")) - .filter(car -> car.getYear() > 2010) - .count(); - System.out.println(count); } @Test public void min() throws Exception { List cars = MockData.getCars(); - double min = cars.stream() - .mapToDouble(Car::getPrice) - .min() - .orElse(0); - System.out.println(min); } @Test public void max() throws Exception { List cars = MockData.getCars(); - double max = cars.stream() - .mapToDouble(Car::getPrice) - .max() - .orElse(0); - System.out.println(max); } @Test public void average() throws Exception { List cars = MockData.getCars(); - double average = cars.stream() - .mapToDouble(Car::getPrice) - .average() - .orElse(0); - System.out.println(average); } @Test public void sum() throws Exception { List cars = MockData.getCars(); - double sum = cars.stream() - .mapToDouble(Car::getPrice) - .sum(); - System.out.println(BigDecimal.valueOf(sum)); } @Test public void statistics() throws Exception { List cars = MockData.getCars(); - DoubleSummaryStatistics statistics = cars.stream() - .mapToDouble(Car::getPrice) - .summaryStatistics(); - System.out.println(statistics.getCount()); - System.out.println(statistics.getMin()); - System.out.println(statistics.getMax()); - System.out.println(statistics.getAverage()); - System.out.println(BigDecimal.valueOf(statistics.getSum())); } } \ No newline at end of file diff --git a/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java b/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java index ea10622..4d6b267 100644 --- a/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java +++ b/src/test/java/com/amigoscode/examples/TransformationsMapAndReduce.java @@ -17,39 +17,16 @@ public class TransformationsMapAndReduce { @Test void yourFirstTransformationWithMap() throws IOException { List people = MockData.getPeople(); - - Function personPersonDTOFunction = person -> - new PersonDTO( - person.getId(), - person.getFirstName(), - person.getAge()); - - List dtos = people.stream() - .filter(person -> person.getAge() > 20) - .map(PersonDTO::map) - .collect(Collectors.toList()); - - dtos.forEach(System.out::println); - } @Test void mapToDoubleAndFindAverageCarPrice() throws IOException { List cars = MockData.getCars(); - double avg = cars.stream() - .mapToDouble(Car::getPrice) - .average() - .orElse(0); - System.out.println(avg); } @Test public void reduce() { int[] integers = {1, 2, 3, 4, 99, 100, 121, 1302, 199}; - int sum = Arrays.stream(integers).reduce(0, Integer::sum); - int sub = Arrays.stream(integers).reduce(0, (a, b) -> a - b); - System.out.println(sum); - System.out.println(sub); } } diff --git a/src/test/java/com/amigoscode/examples/TransformationsWithFlatMap.java b/src/test/java/com/amigoscode/examples/TransformationsWithFlatMap.java index 67661ca..0679089 100644 --- a/src/test/java/com/amigoscode/examples/TransformationsWithFlatMap.java +++ b/src/test/java/com/amigoscode/examples/TransformationsWithFlatMap.java @@ -26,19 +26,11 @@ void setUp() { public void withoutFlatMap() throws Exception { // [Mariam, Alex, Ismail, John, Alesha, Andre, Susy, Ali] List names = new ArrayList<>(); - for (List strings : arrayListOfNames) { - names.addAll(strings); - } - System.out.println(names); } @Test public void withFlatMap() throws Exception { // [Mariam, Alex, Ismail, John, Alesha, Andre, Susy, Ali] - List names = arrayListOfNames.stream() - .flatMap(List::stream) - .collect(Collectors.toList()); - System.out.println(names); } @Test @@ -47,12 +39,6 @@ public void flatMapWithOptionals() { Optional.of("Amigos"), Optional.of("Code") ); - - List list = optionals.stream() - .flatMap(Optional::stream) - .collect(Collectors.toList()); - - System.out.println(list); } } diff --git a/src/test/java/com/amigoscode/examples/WorkingWithStreams.java b/src/test/java/com/amigoscode/examples/WorkingWithStreams.java index 545b274..0818b7c 100644 --- a/src/test/java/com/amigoscode/examples/WorkingWithStreams.java +++ b/src/test/java/com/amigoscode/examples/WorkingWithStreams.java @@ -12,15 +12,5 @@ public class WorkingWithStreams { @Test void steams() { List names = List.of("Amigoscode", "Alex", "Zara"); - Stream stream = names.stream(); - - Stream namesStream = Stream.of("Amigoscode", "Alex", "Zara"); - - long count = stream - .limit(2).map(null).sorted(null).dropWhile(null) - .count(); - - String[] namesArray = {}; - Arrays.stream(namesArray); } } From a843e9657f353f575035b9723458a06b7ea58bc6 Mon Sep 17 00:00:00 2001 From: amigoscode Date: Sun, 17 Oct 2021 00:05:56 +0100 Subject: [PATCH 2/3] readme --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..60aa8ab --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# Java Streams API +https://amigoscode.com/p/java-streams +![cover](https://user-images.githubusercontent.com/40702606/137604079-5a73276f-a32a-4f03-adca-752f9a01adc2.png) + +# Course Description +Functional programming is becoming very popular and it focuses around pure functions. Functional applications avoid the shared state, and tend to be more concise and predictable than those using object-oriented code. In this course Nelson will teach you how to move away from imperative to declarative programming allowing you to write less code and focus on what is important when build applications. + +## List of topics for this course +- What is functional programming +- Stream API +- Transformations with Map +- Reduce +- Filter +- Collectors +- Statistics +- Grouping +- Parallel steams +- Exercises \ No newline at end of file From f867b5fb9457e1cf28fe06fe076ef2d358121dc5 Mon Sep 17 00:00:00 2001 From: amigoscode Date: Sun, 24 Oct 2021 19:34:44 +0100 Subject: [PATCH 3/3] Understanding steams --- .../examples/UnderstandingStreams.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/test/java/com/amigoscode/examples/UnderstandingStreams.java diff --git a/src/test/java/com/amigoscode/examples/UnderstandingStreams.java b/src/test/java/com/amigoscode/examples/UnderstandingStreams.java new file mode 100644 index 0000000..d6cced7 --- /dev/null +++ b/src/test/java/com/amigoscode/examples/UnderstandingStreams.java @@ -0,0 +1,47 @@ +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 UnderstandingStreams { + + @Test + void collect() throws IOException { + List emails = MockData.getPeople() + .stream() + .map(Person::getEmail) + .collect( + ArrayList::new, + ArrayList::add, + ArrayList::addAll + ); + emails.forEach(System.out::println); + } + + @Test + public void lazy() throws Exception { + System.out.println( + MockData.getCars() + .stream() + .filter(car -> { + System.out.println("filter car " + car); + return car.getPrice() < 10000; + }) + .map(car -> { + System.out.println("mapping car " + car); + return car.getPrice(); + }) + .map(price -> { + System.out.println("mapping price " + price); + return price + (price * .14); + }) + .collect(Collectors.toList()) + ); + } +}