modelsFunctional = FunctionalProgramming.getModelsAfter2000UsingPipeline(cars);
+ LOGGER.info(modelsFunctional.toString());
+ }
+}
diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java
new file mode 100644
index 000000000..be113c7cd
--- /dev/null
+++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Car.java
@@ -0,0 +1,56 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package com.iluwatar.collectionpipeline;
+
+/**
+ * A Car class that has the properties of make, model, and year.
+ */
+public class Car {
+ private String make;
+ private String model;
+ private int year;
+
+ /**
+ * Constructor to create an instance of car.
+ * @param theMake the make of the car
+ * @param theModel the model of the car
+ * @param yearOfMake the year of built of the car
+ */
+ public Car(String theMake, String theModel, int yearOfMake) {
+ make = theMake;
+ model = theModel;
+ year = yearOfMake;
+ }
+
+ public String getMake() {
+ return make;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public int getYear() {
+ return year;
+ }
+}
\ No newline at end of file
diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java
new file mode 100644
index 000000000..7d9834bc0
--- /dev/null
+++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/FunctionalProgramming.java
@@ -0,0 +1,61 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package com.iluwatar.collectionpipeline;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Iterating and sorting with a collection pipeline
+ *
+ * In functional programming, it's common to sequence complex operations through
+ * a series of smaller modular functions or operations. The series is called a
+ * composition of functions, or a function composition. When a collection of
+ * data flows through a function composition, it becomes a collection pipeline.
+ * Function Composition and Collection Pipeline are two design patterns
+ * frequently used in functional-style programming.
+ *
+ *
Instead of passing a lambda expression to the map method, we passed the
+ * method reference Car::getModel. Likewise, instead of passing the lambda
+ * expression car -> car.getYear() to the comparing method, we passed the method
+ * reference Car::getYear. Method references are short, concise, and expressive.
+ * It is best to use them wherever possible.
+ *
+ */
+public class FunctionalProgramming {
+ private FunctionalProgramming() {
+ }
+
+ /**
+ * Method to get models using for collection pipeline.
+ *
+ * @param cars {@link List} of {@link Car} to be used for filtering
+ * @return {@link List} of {@link String} representing models built after year 2000
+ */
+ public static List getModelsAfter2000UsingPipeline(List cars) {
+ return cars.stream().filter(car -> car.getYear() > 2000)
+ .sorted(Comparator.comparing(Car::getYear))
+ .map(Car::getModel).collect(Collectors.toList());
+ }
+}
diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java
new file mode 100644
index 000000000..092469fbd
--- /dev/null
+++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/ImperativeProgramming.java
@@ -0,0 +1,80 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package com.iluwatar.collectionpipeline;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * Imperative-style programming to iterate over the list and get the names of
+ * cars made later than the year 2000. We then sort the models in ascending
+ * order by year.
+ *
+ * As you can see, there's a lot of looping in this code. First, the
+ * getModelsAfter2000UsingFor method takes a list of cars as its parameter. It
+ * extracts or filters out cars made after the year 2000, putting them into a
+ * new list named carsSortedByYear. Next, it sorts that list in ascending order
+ * by year-of-make. Finally, it loops through the list carsSortedByYear to get
+ * the model names and returns them in a list.
+ *
+ *
This short example demonstrates what I call the effect of statements. While
+ * functions and methods in general can be used as expressions, the {@link Collections}
+ * sort method doesn't return a result. Because it is used as a statement, it
+ * mutates the list given as argument. Both of the for loops also mutate lists
+ * as they iterate. Being statements, that's just how these elements work. As a
+ * result, the code contains unnecessary garbage variables
+ */
+public class ImperativeProgramming {
+ private ImperativeProgramming() {
+ }
+
+ /**
+ * Method to return the car models built after year 2000 using for loops.
+ * @param cars {@link List} of {@link Car} to iterate over
+ * @return {@link List} of {@link String} of car models built after year 2000
+ */
+ public static List getModelsAfter2000UsingFor(List cars) {
+ List carsSortedByYear = new ArrayList<>();
+
+ for (Car car : cars) {
+ if (car.getYear() > 2000) {
+ carsSortedByYear.add(car);
+ }
+ }
+
+ Collections.sort(carsSortedByYear, new Comparator() {
+ public int compare(Car car1, Car car2) {
+ return new Integer(car1.getYear()).compareTo(car2.getYear());
+ }
+ });
+
+ List models = new ArrayList<>();
+ for (Car car : carsSortedByYear) {
+ models.add(car.getModel());
+ }
+
+ return models;
+ }
+}
diff --git a/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Iterating.java b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Iterating.java
new file mode 100644
index 000000000..4293603cb
--- /dev/null
+++ b/collection-pipeline/src/main/java/com/iluwatar/collectionpipeline/Iterating.java
@@ -0,0 +1,46 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package com.iluwatar.collectionpipeline;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A factory class to create a collection of {@link Car} instances.
+ */
+public class Iterating {
+ private Iterating() {
+ }
+
+ /**
+ * Factory method to create a {@link List} of {@link Car} instances.
+ * @return {@link List} of {@link Car}
+ */
+ public static List createCars() {
+ return Arrays.asList(new Car("Jeep", "Wrangler", 2011), new Car("Jeep", "Comanche", 1990),
+ new Car("Dodge", "Avenger", 2010),
+ new Car("Buick", "Cascada", 2016),
+ new Car("Ford", "Focus", 2012),
+ new Car("Chevrolet", "Geo Metro", 1992));
+ }
+}
\ No newline at end of file
diff --git a/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java b/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java
new file mode 100644
index 000000000..26f546a16
--- /dev/null
+++ b/collection-pipeline/src/test/java/com/iluwatar/collectionpipeline/AppTest.java
@@ -0,0 +1,50 @@
+/**
+ * The MIT License
+ * Copyright (c) 2014 Ilkka Seppälä
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+package com.iluwatar.collectionpipeline;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * Tests that Collection Pipeline methods work as expected.
+ */
+public class AppTest {
+
+ private List cars = Iterating.createCars();
+
+ @Test
+ public void testGetModelsAfter2000UsingFor() {
+ List models = ImperativeProgramming.getModelsAfter2000UsingFor(cars);
+ assertEquals(models, Arrays.asList("Avenger", "Wrangler", "Focus", "Cascada"));
+ }
+
+ @Test
+ public void testGetModelsAfter2000UsingPipeline() {
+ List models = FunctionalProgramming.getModelsAfter2000UsingPipeline(cars);
+ assertEquals(models, Arrays.asList("Avenger", "Wrangler", "Focus", "Cascada"));
+ }
+}
diff --git a/pom.xml b/pom.xml
index e1d025c13..9d2ca8066 100644
--- a/pom.xml
+++ b/pom.xml
@@ -161,6 +161,7 @@
dirty-flag
trampoline
serverless
+ collection-pipeline