Functional Programming in Java 8+ using the Stream API with Example

API is an acronym for Application Programming Interface, which is software and the java streams work on a data source. Consider a stream like a flow of water in a small canal. Let’s take a real-life example. Each time a user uses an application that is popular these days like WhatsApp in order to communicate via delivering text messages or calls to other users. Both users are using an API.
Java streams work on three operations which as mentioned below
- Data Source
 - Intermediate operation
 - Terminal operation
 
Methods: Streams can be created in three ways
- Using an object of any class from the collection framework
 - Using an array of the reference data type
 - Using the interface defined in the ‘java.util.stream’ package
 
Method 1: Data Source
The data source can be widely varied such as an array, List, etc
Syntax:
ArrayList<Integer> numbers = new ArrayList<>();
Integer[] numbers = {1,2,3};
Example 1: Using an object as a data source
Java
// Java Program showcasing data source// using an object as a data source// Importing input output classesimport java.io.*;// Classclass GFG {    // Main driver method    public static void main(String[] args)    {        // Data Source        // Creating an arrayList object        // Declaring object of String type        ArrayList<String> gfgNames = new ArrayList<>();        // Custom input elements to above object        gfgNames.add("Dean");        gfgNames.add("castee");        gfgNames.add("robert");        // Creating object of Stream where Stream is created        // using arrayList and object as data source        Stream<String> streamOfNames = gfgNames.stream();        // Print and display element        System.out.print(streamOfNames);    }} | 
 
Example 2: Using an array as a data source
// Data Source
Integer[] numbers = {1,2,3,4,5};
// Stream using an array Stream<Integer> streamOfNumbers = Arrays.stream(numbers);
// using predefined Instream interface integerStream = IntStream.range(1,100); // a stream from 1 to 99;
Java
// Java Program showcasing data source// using an array as a data source// Importing java input output classimport java.io.*;// Importing all classes from// java.util packageimport java.util.*;// Importing class for additional operations,// additionls and pipelinesimport java.util.stream.IntStream;// Classclass GFG {    // Main driver method    public static void main(String[] args)    {        // Creating a predefined stream using range method        // Custom inputs for range as parameters        var stream = IntStream.range(1, 100);        // Stream is created        var max = stream.filter(number -> number % 4 == 0)                      .count();        // Print and display the maximum number        // from the stream        System.out.println(max);    }} | 
24
Method 2: Intermediate Operation
Intermediate operations are some methods that one can apply on a stream.
Note: It can be of any number
filter()
Example:
Java
import java.io.*;class GFG {    public static void main(String[] args)    {        // Data Source        Integer[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }        // Stream        Stream<Integer> streamOfNumbers            = Arrays.stream(numbers);        // filter all the even numbers        Stream<Integer> evenNumbersStream            = streamOfNumbers.filter(                number -> number % 2 == 0)    }} | 
 
Method 3: Terminal operation
Terminal operation methods that we can apply on a stream that will cause a stream to be “closed”.
Concept:
Some terminal operations can be used to iterate on the elements of the stream.
min(),max(),count()
forEach(),noneMatch()
Example 1: Explaining stream API
Java
// Importing input output classesimport java.io.*;// Importing all classes from// java.util packageimport java.util.*;// Classclass GFG {    // Main driver method    public static void main(String[] args)    {        // Data source        // Custom integer inputs        Integer[] numbers            = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };        // Stream        var streamOfNumbers = Arrays.stream(numbers);        // Using filter method        var evenNumbersStream            = streamOfNumbers                  .filter(number -> number % 3 == 0)                  .count();        // Print and display        System.out.println(evenNumbersStream);    }} | 
4
Example 2:
Java
// Importing all classes from java.util packageimport java.io.*;import java.util.*;// Classclass GFG {  // Main driver method    public static void main(String[] args)    {      // Creating an ArrayList of Integer type        ArrayList<Integer> list = new ArrayList<>();             // Adding elements to above object of Arraylist      // Custom inputs        list.add(20);        list.add(4);        list.add(76);        list.add(21);        list.add(3);        list.add(80);        var stream = list.stream();        var numbers            = stream.filter(number -> number % 2 == 0)                  .filter(number -> number > 20);             // Print all the elements of the stream on the console        numbers.forEach(System.out::println);    }} | 
76 80
Note: One can pass lambda also number -> System.out.println(number + ” “)
				
					



