Different Ways to Create a Stream in Java

Introduction

The Stream API in Java 8 is a powerful feature for processing collections of data in a functional and declarative way. Streams allow developers to work with collections through a pipeline of operations such as filtering, mapping, reducing, and collecting. Before working with streams, you need to create one. Java 8 provides multiple ways to create a stream, depending on the data source.

In this tutorial, we will explore eight different ways of creating a stream in Java 8.

Table of Contents

  1. Creating a Stream from a Collection (List, Set, Queue)
  2. Creating a Stream from an Array
  3. Creating a Stream using Stream.of()
  4. Creating a Stream using Stream.generate()
  5. Creating a Stream using Stream.iterate()
  6. Creating a Stream from a File
  7. Creating an Empty Stream
  8. Creating a Stream from String Tokens

1. Creating a Stream from a Collection (List, Set, Queue)

One of the most common ways to create a stream is from a collection like a List, Set, or Queue. The stream() method is available in the Collection interface.

Code Example

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamFromCollection {
    public static void main(String[] args) {
        // Creating a List
        List<String> cities = Arrays.asList("Mumbai", "Delhi", "Bangalore");

        // Creating a stream from the List
        Stream<String> cityStream = cities.stream();

        // Printing elements of the stream
        cityStream.forEach(System.out::println);
    }
}

Output

Mumbai
Delhi
Bangalore

Explanation

  • We create a List of cities and call the stream() method to get a stream of the list elements.

2. Creating a Stream from an Array

You can create a stream directly from an array using the Arrays.stream() method.

Code Example

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamFromArray {
    public static void main(String[] args) {
        // Creating an array
        String[] cities = {"Mumbai", "Delhi", "Bangalore"};

        // Creating a stream from the array
        Stream<String> cityStream = Arrays.stream(cities);

        // Printing elements of the stream
        cityStream.forEach(System.out::println);
    }
}

Output

Mumbai
Delhi
Bangalore

Explanation

  • We use Arrays.stream(cities) to create a stream from the cities array.

3. Creating a Stream using Stream.of()

The Stream.of() method is a convenient way to create a stream from a group of elements or an array.

Code Example

import java.util.stream.Stream;

public class StreamOfExample {
    public static void main(String[] args) {
        // Creating a stream using Stream.of()
        Stream<String> cityStream = Stream.of("Mumbai", "Delhi", "Bangalore");

        // Printing elements of the stream
        cityStream.forEach(System.out::println);
    }
}

Output

Mumbai
Delhi
Bangalore

Explanation

  • The Stream.of() method creates a stream from a fixed set of elements.

4. Creating a Stream using Stream.generate()

The Stream.generate() method generates an infinite stream of elements by repeatedly applying a function (usually a Supplier).

Code Example

import java.util.stream.Stream;

public class StreamGenerateExample {
    public static void main(String[] args) {
        // Creating an infinite stream of random numbers
        Stream<Double> randomNumbers = Stream.generate(Math::random);

        // Limiting the stream to 5 elements and printing them
        randomNumbers.limit(5).forEach(System.out::println);
    }
}

Output (example)

0.7367816494564051
0.9782357115382953
0.46591358280232813
0.19937312269724383
0.939865784026625

Explanation

  • Stream.generate() creates an infinite stream of random numbers.
  • The limit(5) method restricts the stream to the first 5 numbers.

5. Creating a Stream using Stream.iterate()

The Stream.iterate() method generates an infinite stream of elements by iteratively applying a function (usually a UnaryOperator).

Code Example

import java.util.stream.Stream;

public class StreamIterateExample {
    public static void main(String[] args) {
        // Creating an infinite stream of integers starting from 1
        Stream<Integer> integerStream = Stream.iterate(1, n -> n + 1);

        // Limiting the stream to 5 elements and printing them
        integerStream.limit(5).forEach(System.out::println);
    }
}

Output

1
2
3
4
5

Explanation

  • The Stream.iterate() method generates an infinite stream by starting at 1 and incrementing by 1.
  • We use limit(5) to limit the stream to 5 elements.

6. Creating a Stream from a File

You can create a stream of lines from a file using Files.lines() method. This method returns a Stream<String> where each line in the file is a stream element.

Code Example

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;
import java.io.IOException;

public class StreamFromFile {
    public static void main(String[] args) {
        try (Stream<String> lines = Files.lines(Paths.get("sample.txt"))) {
            // Printing each line of the file
            lines.forEach(System.out::println);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Explanation

  • The Files.lines() method reads all the lines from the file sample.txt and returns a stream of lines.
  • The stream processes each line of the file, printing it to the console.

7. Creating an Empty Stream

You can create an empty stream using the Stream.empty() method. This is useful when you need to return an empty stream in certain conditions.

Code Example

import java.util.stream.Stream;

public class EmptyStreamExample {
    public static void main(String[] args) {
        // Creating an empty stream
        Stream<String> emptyStream = Stream.empty();

        // Printing the count of elements in the empty stream
        System.out.println("Number of elements in the stream: " + emptyStream.count());
    }
}

Output

Number of elements in the stream: 0

Explanation

  • Stream.empty() creates a stream with no elements.
  • We print the count of elements in the empty stream, which is 0.

8. Creating a Stream from String Tokens

You can create a stream from a string by splitting it into tokens using Pattern.splitAsStream().

Code Example

import java.util.regex.Pattern;
import java.util.stream.Stream;

public class StreamFromString {
    public static void main(String[] args) {
        String sentence = "Java 8 streams are awesome";

        // Creating a stream from the sentence by splitting it into words
        Stream<String> wordStream = Pattern.compile(" ").splitAsStream(sentence);

        // Printing each word
        wordStream.forEach(System.out::println);
    }
}

Output

Java
8
streams
are
awesome

Explanation

  • We use the Pattern.compile(" ").splitAsStream() method to split the string into words (tokens) and create a stream of those words.

Conclusion

Java 8 provides multiple ways to create a stream, depending on the data source. Streams can be created from collections, arrays, files, or even generated dynamically. Understanding these different stream creation methods is important for working efficiently with the Stream API and processing data in a functional and declarative way.

Comments