Learnitweb

How to create stream in Java 8

An instance of stream can be created from different sources. In this tutorial, we’ll discuss different ways to create a stream instance.

First, we’ll discuss stream of four different sources: array, a collection, generator function and I/O channel.

Stream of Array

There are two common methods used to create stream of Array: Stream.of() and Arrays.stream().

//String array
String[] strArray = new String[] {"one","two","three"};

//Stream of array using Stream.of()
Stream<String> streamOfArray = Stream.of(strArray);

//Stream of array using Arrays.stream()
Stream<String> streamOfArr = Arrays.stream(strArray);
import java.util.Arrays;
import java.util.Iterator;
import java.util.stream.Stream;

public class StreamExample {
	public static void main(String args[]) {
		//initialize string array
		String[] strArray = new String[] {"one","two","three"};
		
		//Stream of array using Stream.of()
		Stream<String> streamOfArray = Stream.of(strArray);
		
		//Stream of array using Arrays.stream()
		Stream<String> streamOfArr = Arrays.stream(strArray);
		
		Iterator<String> itr1 = streamOfArray.iterator();
		Iterator<String> itr2 = streamOfArr.iterator();

	    // Iterate first stream object 
	    while (itr1.hasNext()) { 
	        System.out.print(itr1.next() + " "); 
	    }
	    
	    //to print empty line
	    System.out.println();
	    
	    // Iterate second stream object 
	    while (itr2.hasNext()) { 
	        System.out.print(itr2.next() + " "); 
	    }
	}
}  

Output

one two three
one two three

Stream of Collection

The source of stream can also be a collection. List.stream() is an example of creating stream of list.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class StreamExample {
	public static void main(String args[]) {
		//create a list of string
		List<String> list = new ArrayList();
		list.add("one");
		list.add("two");
		list.add("three");
		
		Iterator<String> itr = list.iterator();
	
	    // Iterate first stream object 
	    while (itr.hasNext()) { 
	        System.out.print(itr.next() + " "); 
	    }
	}
}

Output

one two three

Create a stream using Stream.generate()

generate() method accepts a Supplier and returns an infinite sequential unordered stream. This is suitable for generating constant streams, streams of random elements, etc. generate() method returns an infinite stream, so to restrict it we can provide a limit.

import java.util.stream.Stream;

public class StreamExample {
	private static <T> void getStream(int limit) {
		//create stream using generate() method
		Stream.generate(Math::random)
			.limit(limit)
			.forEach(System.out::println);
	}
	
	public static void main(String args[]) {
		// call getStream method to get stream using generate()
		//method with limit 5
		getStream(5);
	}
} 

Output

0.36224928907365705
0.6460205728645343
0.9987652362519464
0.3599350422313422
0.3277652917995362

Stream of File

Files class from java.nio has method lines() which returns lines from file as Stream.

String fileName = "d://file.txt";
Stream<String> stream = Files.lines(Paths.get(fileName))

Contents of file.txt

first line
second line
third line
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;

public class StreamExample {
	
	public static void main(String args[]) {
		String fileName = "d://file.txt";

        //read file into stream
		// used try-with-resources as we need to close stream
        try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

            stream.forEach(System.out::println);

        } catch (IOException e) {
            e.printStackTrace();
        }
	}
}  

Output

first line
second line
third line

Now we’ll also see few other examples to generate stream. There are methods in Stream which return a Stream. In this tutorial we’ll discuss few of these cases.

Empty Stream

Stream.empty() method returns an empty sequential stream.

Stream<String> emptyStream = Stream.empty();

Create a stream from specified values using Stream.of()

Stream.of(T… values) returns a sequential ordered stream whose elements are the specified values.

import java.util.stream.Stream; 
  
class StreamExample { 
     
    public static void main(String[] args) { 
    	//Create a stream from specified string values 
        Stream<String> stream = Stream.of("Sun","Mon","Tue","Wed"); 
  
        //Print sequential ordered stream 
        stream.forEach(element -> System.out.print(element + " ")); 
    } 
}

Output

Sun Mon Tue Wed

Create a stream using Stream.builder()

builder() method returns a builder for a Stream.

import java.util.stream.Stream; 
  
class StreamExample { 
     
    public static void main(String[] args) { 
    	//Create a builder of Stream 
        Stream.Builder<String> builder = Stream.builder(); 
  
        //add elements
        builder.add("one");
        builder.add("two");
        builder.add("three");
        
        //build stream 
        Stream<String> stream =  builder.build();
        
        //print stream 
        stream.forEach(element -> System.out.print(element + " ")); 
    } 
} 

Output

one two three

Create stream from Iterator

We need to use Spliterators.spliteratorUnknownSize to convert the Iterator into a Spliterator, followed by StreamSupport.stream to convert the Spliterator into a Stream.

import java.util.Arrays;
import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport; 
  
class StreamExample { 
     
    public static void main(String[] args) { 
    	Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();
    	Stream<String> targetStream = StreamSupport.stream(
    	          Spliterators.spliteratorUnknownSize(sourceIterator, Spliterator.ORDERED),
    	          false);
        
        //print stream 
    	targetStream.forEach(element -> System.out.print(element + " ")); 
    } 
} 

Output

A B C 

Create Stream from Iterable

First we have to get Iterable from Iterator. And then create Spliterator from Iterable, followed by StreamSupport.stream to convert Spliterator into a Stream.

import java.util.Arrays;
import java.util.Iterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport; 
  
class StreamExample { 
     
    public static void main(String[] args) { 
    	//create Iterator
    	Iterator<String> sourceIterator = Arrays.asList("A", "B", "C").iterator();

    	//create Iterable from Iterator
    	Iterable<String> iterable = () -> sourceIterator;
    	
    	//Create Spliterator from Iterable, followed by creating stream from Spliterator
    	Stream<String> targetStream = StreamSupport.stream(iterable.spliterator(), false);
        
        //print stream 
    	targetStream.forEach(element -> System.out.print(element + " ")); 
    } 
} 

Output

A B C