Streams Vs Collections

Java 8’s Stream API represents a significant shift from traditional iteration techniques for processing collections of data. Here’s a comparison of the two approaches:

Feature Collections Streams
Definition In-memory data structure to store and manage data Abstraction for processing data in a functional style
Storage Stores data elements Does not store elements, just processes them
Traversal External iteration (e.g., for-loop, iterator) Internal iteration (e.g., stream().forEach())
Type Eager (loads entire collection in memory) Lazy (evaluated only when terminal operation is called)
Modifiable Can modify the underlying data Cannot modify the source; results are computed
Usage Purpose For storing and managing data For processing and transforming data
Operations Limited (add, remove, sort, etc.) Rich (filter, map, reduce, collect, etc.)
Parallel Execution Not inherently parallel Easily parallelizable using parallelStream()
Infinite Data Support Cannot handle infinite data Can work with infinite streams (e.g., Stream.iterate())
API introduced in Java 1.2 Java 8
Examples ArrayList, HashSet, HashMap, LinkedList filter(), map(), collect(), reduce()
Reusability Collections can be reused after use Streams cannot be reused once consumed
Null Handling Allows null elements (e.g., in lists) May throw NullPointerException on some operations
Mutability Can be mutable or immutable Stream pipeline is immutable
import java.util.*;

public class CollectionsCustomExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("LotusJavaPrince", "Mahesh", "Manish", "Aarav", "Alok", "Amit");

        List<String> filteredNames = new ArrayList<>();
        for (String name : names) {
            if (name.startsWith("A")) {
                filteredNames.add(name.toUpperCase());
            }
        }

        for (String name : filteredNames) {
            System.out.println(name);
        }
    }
}

The above program using Java8 streams.

import java.util.*;
import java.util.stream.*;

public class StreamsCustomExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("LotusJavaPrince", "Mahesh", "Manish", "Aarav", "Alok", "Amit");

        names.stream()
             .filter(name -> name.startsWith("A"))
             .map(String::toUpperCase)
             .forEach(System.out::println);
    }
}

While traditional iteration is straightforward and familiar, the Stream API offers a modern approach that simplifies complex data processing tasks, enhances code readability, and leverages parallelism. As a result, Streams are often preferred for their elegance and efficiency in handling collections.

Scroll to Top