diff --git a/core-java-modules/core-java-streams/.gitignore b/core-java-modules/core-java-streams/.gitignore
new file mode 100644
index 0000000000..3de4cc647e
--- /dev/null
+++ b/core-java-modules/core-java-streams/.gitignore
@@ -0,0 +1,26 @@
+*.class
+
+0.*
+
+#folders#
+/target
+/neoDb*
+/data
+/src/main/webapp/WEB-INF/classes
+*/META-INF/*
+.resourceCache
+
+# Packaged files #
+*.jar
+*.war
+*.ear
+
+# Files generated by integration tests
+*.txt
+backup-pom.xml
+/bin/
+/temp
+
+#IntelliJ specific
+.idea/
+*.iml
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md
new file mode 100644
index 0000000000..b950325e40
--- /dev/null
+++ b/core-java-modules/core-java-streams/README.md
@@ -0,0 +1,16 @@
+## Core Java streams
+
+This module contains articles about the Stream API in Java.
+
+### Relevant Articles:
+- [Java 8 and Infinite Streams](https://www.baeldung.com/java-inifinite-streams)
+- [How to Get the Last Element of a Stream in Java?](https://www.baeldung.com/java-stream-last-element)
+- [“Stream has already been operated upon or closed” Exception in Java](https://www.baeldung.com/java-stream-operated-upon-or-closed-exception)
+- [Iterable to Stream in Java](https://www.baeldung.com/java-iterable-to-stream)
+- [How to Iterate Over a Stream With Indices](https://www.baeldung.com/java-stream-indices)
+- [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering)
+- [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda)
+- [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count)
+- [Summing Numbers with Java Streams](https://www.baeldung.com/java-stream-sum)
+- [How to Find all Getters Returning Null](https://www.baeldung.com/java-getters-returning-null)
+- More articles: [[next -->]](/../core-java-streams-2)
diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml
new file mode 100644
index 0000000000..93b0253f35
--- /dev/null
+++ b/core-java-modules/core-java-streams/pom.xml
@@ -0,0 +1,113 @@
+
+
+ 4.0.0
+ core-java-streams
+ 0.1.0-SNAPSHOT
+ core-java-streams
+ jar
+
+
+ com.ossez.core-java-modules
+ core-java-modules
+ 0.0.2-SNAPSHOT
+ ../pom.xml
+
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+ provided
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ com.codepoetics
+ protonpack
+ ${protonpack.version}
+
+
+ io.vavr
+ vavr
+ ${vavr.version}
+
+
+ one.util
+ streamex
+ ${streamex.version}
+
+
+ org.aspectj
+ aspectjrt
+ ${asspectj.version}
+
+
+ org.aspectj
+ aspectjweaver
+ ${asspectj.version}
+
+
+ pl.touk
+ throwing-function
+ ${throwing-function.version}
+
+
+
+
+ core-java-streams
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ -parameters
+
+
+
+
+
+
+ 0.9.0
+ 1.15
+ 0.6.5
+ 2.10
+ 1.3
+ 1.8.9
+ 3.1
+ 1.8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/InfiniteStreams.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/InfiniteStreams.java
new file mode 100644
index 0000000000..bcad9832b1
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/InfiniteStreams.java
@@ -0,0 +1,32 @@
+package com.ossez.stream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.stream.Stream;
+
+public class InfiniteStreams {
+
+ private static final Logger LOG = LoggerFactory.getLogger(InfiniteStreams.class);
+
+ public static void main(String[] args) {
+ doWhileOldWay();
+
+ doWhileStreamWay();
+
+ }
+
+ private static void doWhileOldWay() {
+
+ int i = 0;
+ while (i < 10) {
+ LOG.debug("{}", i);
+ i++;
+ }
+ }
+
+ private static void doWhileStreamWay() {
+ Stream integers = Stream.iterate(0, i -> i + 1);
+ integers.limit(10).forEach(System.out::println);
+ }
+}
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/StreamApi.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/StreamApi.java
new file mode 100644
index 0000000000..8fe13f537f
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/StreamApi.java
@@ -0,0 +1,24 @@
+package com.ossez.stream;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+public class StreamApi {
+
+ public static String getLastElementUsingReduce(List valueList) {
+ Stream stream = valueList.stream();
+ return stream.reduce((first, second) -> second).orElse(null);
+ }
+
+ public static Integer getInfiniteStreamLastElementUsingReduce() {
+ Stream stream = Stream.iterate(0, i -> i + 1);
+ return stream.limit(20).reduce((first, second) -> second).orElse(null);
+ }
+
+ public static String getLastElementUsingSkip(List valueList) {
+ long count = (long) valueList.size();
+ Stream stream = valueList.stream();
+ return stream.skip(count - 1).findFirst().orElse(null);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/StreamIndices.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/StreamIndices.java
new file mode 100644
index 0000000000..cab44abc83
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/StreamIndices.java
@@ -0,0 +1,62 @@
+package com.ossez.stream;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.codepoetics.protonpack.Indexed;
+import com.codepoetics.protonpack.StreamUtils;
+
+import io.vavr.collection.Stream;
+import one.util.streamex.EntryStream;
+
+public class StreamIndices {
+
+ public static List getEvenIndexedStrings(String[] names) {
+ List evenIndexedNames = IntStream.range(0, names.length)
+ .filter(i -> i % 2 == 0)
+ .mapToObj(i -> names[i])
+ .collect(Collectors.toList());
+ return evenIndexedNames;
+ }
+
+ public List getEvenIndexedStringsVersionTwo(List names) {
+ List evenIndexedNames = EntryStream.of(names)
+ .filterKeyValue((index, name) -> index % 2 == 0)
+ .values()
+ .toList();
+ return evenIndexedNames;
+ }
+
+ public static List> getEvenIndexedStrings(List names) {
+ List> list = StreamUtils.zipWithIndex(names.stream())
+ .filter(i -> i.getIndex() % 2 == 0)
+ .collect(Collectors.toList());
+ return list;
+ }
+
+ public static List> getOddIndexedStrings(List names) {
+ List> list = StreamUtils.zipWithIndex(names.stream())
+ .filter(i -> i.getIndex() % 2 == 1)
+ .collect(Collectors.toList());
+ return list;
+ }
+
+ public static List getOddIndexedStrings(String[] names) {
+ List oddIndexedNames = IntStream.range(0, names.length)
+ .filter(i -> i % 2 == 1)
+ .mapToObj(i -> names[i])
+ .collect(Collectors.toList());
+ return oddIndexedNames;
+ }
+
+ public static List getOddIndexedStringsVersionTwo(String[] names) {
+ List oddIndexedNames = Stream.of(names)
+ .zipWithIndex()
+ .filter(tuple -> tuple._2 % 2 == 1)
+ .map(tuple -> tuple._1)
+ .toJavaList();
+ return oddIndexedNames;
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/filter/Customer.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/filter/Customer.java
new file mode 100644
index 0000000000..887e043543
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/filter/Customer.java
@@ -0,0 +1,55 @@
+package com.ossez.stream.filter;
+
+import javax.net.ssl.HttpsURLConnection;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+public class Customer {
+ private String name;
+ private int points;
+ private String profilePhotoUrl;
+
+ public Customer(String name, int points) {
+ this(name, points, "");
+ }
+
+ public Customer(String name, int points, String profilePhotoUrl) {
+ this.name = name;
+ this.points = points;
+ this.profilePhotoUrl = profilePhotoUrl;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getPoints() {
+ return points;
+ }
+
+ public boolean hasOver(int points) {
+ return this.points > points;
+ }
+
+ public boolean hasOverHundredPoints() {
+ return this.points > 100;
+ }
+
+ public boolean hasValidProfilePhoto() throws IOException {
+ URL url = new URL(this.profilePhotoUrl);
+ HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
+ return connection.getResponseCode() == HttpURLConnection.HTTP_OK;
+ }
+
+ public boolean hasValidProfilePhotoWithoutCheckedException() {
+ try {
+ URL url = new URL(this.profilePhotoUrl);
+ HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
+ return connection.getResponseCode() == HttpURLConnection.HTTP_OK;
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/ArithmeticUtils.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/ArithmeticUtils.java
new file mode 100644
index 0000000000..8ca27a6f5c
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/ArithmeticUtils.java
@@ -0,0 +1,8 @@
+package com.ossez.stream.sum;
+
+public class ArithmeticUtils {
+
+ public static int add(int a, int b) {
+ return a + b;
+ }
+}
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/Item.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/Item.java
new file mode 100644
index 0000000000..010ff3f631
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/Item.java
@@ -0,0 +1,31 @@
+package com.ossez.stream.sum;
+
+public class Item {
+
+ private int id;
+ private Integer price;
+
+ public Item(int id, Integer price) {
+ super();
+ this.id = id;
+ this.price = price;
+ }
+
+ // Standard getters and setters
+ public long getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public Integer getPrice() {
+ return price;
+ }
+
+ public void setPrice(Integer price) {
+ this.price = price;
+ }
+
+}
diff --git a/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/StreamSumCalculator.java b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/StreamSumCalculator.java
new file mode 100644
index 0000000000..015d2e0a4d
--- /dev/null
+++ b/core-java-modules/core-java-streams/src/main/java/com/ossez/stream/sum/StreamSumCalculator.java
@@ -0,0 +1,59 @@
+package com.ossez.stream.sum;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class StreamSumCalculator {
+
+ public static Integer getSumUsingCustomizedAccumulator(List integers) {
+ return integers.stream()
+ .reduce(0, ArithmeticUtils::add);
+
+ }
+
+ public static Integer getSumUsingJavaAccumulator(List integers) {
+ return integers.stream()
+ .reduce(0, Integer::sum);
+
+ }
+
+ public static Integer getSumUsingReduce(List integers) {
+ return integers.stream()
+ .reduce(0, (a, b) -> a + b);
+
+ }
+
+ public static Integer getSumUsingCollect(List integers) {
+
+ return integers.stream()
+ .collect(Collectors.summingInt(Integer::intValue));
+
+ }
+
+ public static Integer getSumUsingSum(List integers) {
+
+ return integers.stream()
+ .mapToInt(Integer::intValue)
+ .sum();
+ }
+
+ public static Integer getSumOfMapValues(Map