diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index ecfa399..e0472d0 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -6,11 +6,13 @@
+
+
diff --git a/.idea/junitgenerator-prj-settings.xml b/.idea/junitgenerator-prj-settings.xml
new file mode 100644
index 0000000..d73e792
--- /dev/null
+++ b/.idea/junitgenerator-prj-settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modern-java/pom.xml b/modern-java/pom.xml
new file mode 100644
index 0000000..6b569dd
--- /dev/null
+++ b/modern-java/pom.xml
@@ -0,0 +1,45 @@
+
+
+ 4.0.0
+
+ modern-java
+ jar
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 9
+ 9
+
+
+
+
+
+
+ fpgym
+ org.gym.fp
+ 1.0
+
+
+
+ 9
+ 9
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+ junit
+ junit
+ test
+
+
+
+
diff --git a/modern-java/src/main/java/org/gym/fp/moderjava/Dish.java b/modern-java/src/main/java/org/gym/fp/moderjava/Dish.java
new file mode 100644
index 0000000..fcdfdc0
--- /dev/null
+++ b/modern-java/src/main/java/org/gym/fp/moderjava/Dish.java
@@ -0,0 +1,26 @@
+package org.gym.fp.moderjava;
+
+import lombok.AllArgsConstructor;
+import lombok.Value;
+
+@Value
+@AllArgsConstructor
+public final class Dish {
+ private final String name;
+ private final int calories;
+ private final Type type;
+
+ public enum Type {
+ MEAT, FISH, VEGETARIAN, OTHER
+ }
+
+ public boolean isVegetarian() {
+ return this.type == Type.VEGETARIAN;
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+}
diff --git a/modern-java/src/main/java/org/gym/fp/moderjava/StreamTest.java b/modern-java/src/main/java/org/gym/fp/moderjava/StreamTest.java
new file mode 100644
index 0000000..5741c61
--- /dev/null
+++ b/modern-java/src/main/java/org/gym/fp/moderjava/StreamTest.java
@@ -0,0 +1,78 @@
+package org.gym.fp.moderjava;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static java.lang.System.out;
+
+public class StreamTest {
+
+ public static void main(String[] args) {
+ doStreamFilterDemo();
+ doStreamMappingDemo();
+ }
+
+ private static void doStreamFilterDemo() {
+ out.println("FILTER EXAMPLE");
+ getDishes().stream()
+ .filter(Dish::isVegetarian)
+ .collect(Collectors.toList())
+ .forEach(out::println);
+ out.println("----------------------------------------");
+ out.println("DISTINCT EXAMPLE");
+ getDishes().stream()
+ .filter(dish -> dish.getName().length() > 4)
+ .distinct()
+ .forEach(out::println);
+ out.println("----------------------------------------");
+ out.println("TAKEWHILE EXAMPLE");
+ getDishes().stream()
+ .takeWhile(dish -> dish.getCalories() > 40)
+ .forEach(out::println);
+ out.println("----------------------------------------");
+ out.println("DROPWHILE EXAMPLE");
+ getDishes().stream()
+ .dropWhile(dish -> dish.getCalories() > 40)
+ .forEach(out::println);
+ out.println("----------------------------------------");
+ }
+
+ private static void doStreamMappingDemo() {
+ List words = Arrays.asList("Hello", "World");
+ List uniqueCharacters = words.stream()
+ .map(word -> word.split(""))
+ .flatMap(Arrays::stream)
+ .distinct()
+ .collect(Collectors.toList());
+ out.println(uniqueCharacters);
+ out.println("----------------------------------------");
+ List numbers1 = Arrays.asList(1, 2, 3);
+ List numbers2 = Arrays.asList(3, 4);
+ List pairs1 = numbers1.stream()
+ .flatMap(i -> numbers2.stream().map(j -> new int[]{i, j}))
+ .collect(Collectors.toList());
+ pairs1.forEach(pair -> out.println(Arrays.toString(pair)));
+ out.println("----------------------------------------");
+ List pairs2 = numbers1.stream()
+ .flatMap(i -> numbers2.stream().map(j -> new int[]{i, j}))
+ .filter(pair -> (pair[0] + pair[1]) % 3 == 0)
+ .collect(Collectors.toList());
+ pairs2.forEach(pair -> out.println(Arrays.toString(pair)));
+ }
+
+ private static List getDishes() {
+ List dishes = Arrays.asList(
+ new Dish("pork", 300, Dish.Type.MEAT),
+ new Dish("salad", 50, Dish.Type.VEGETARIAN),
+ new Dish("chicken", 100, Dish.Type.MEAT),
+ new Dish("chicken", 100, Dish.Type.MEAT),
+ new Dish("tomato", 30, Dish.Type.VEGETARIAN),
+ new Dish("tunny", 120, Dish.Type.FISH),
+ new Dish("potato", 70, Dish.Type.VEGETARIAN)
+ );
+ return Collections.unmodifiableList(dishes);
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index dafdb24..2c0feec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,8 @@
scala
-
+ modern-java
+