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 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/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()) + ); + } +} 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); } }