Understanding the difference between Collection
and Stream
is essential to writing clean, modern Java code.
Let’s break it down in a clear and structured way.
✅ Quick Summary
Feature | Collection | Stream |
---|---|---|
💾 Stores Data | ✅ Yes — stores elements in memory | ❌ No — processes elements from a source |
🔁 Reusable | ✅ Yes — can iterate multiple times | ❌ No — can be used only once |
🐢 Eager vs Lazy | Eager — holds all data immediately | Lazy — computations done on demand |
🔧 Mutability | ✅ Mutable (add , remove , etc.) | ❌ Immutable — doesn’t change data source |
💬 Purpose | Data storage | Data processing (transform/filter/map) |
🧵 Parallelism | Manual (via threads or parallel loops) | Built-in with parallelStream() |
✅ What is a Collection
?
A Collection
is:
- A container of elements (e.g.
List
,Set
,Queue
) - Stored fully in memory
- Used to store and retrieve elements
- Supports adding/removing/modifying
Example:
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
System.out.println(names); // [Alice, Bob]
✅ What is a Stream
?
A Stream
is:
- A view over data from a source (like a Collection, array, file, etc.)
- Designed for processing data with operations like
map()
,filter()
,reduce()
- Does not store data
- Single-use: once consumed, it’s gone
Example:
List<String> names = List.of("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.length() > 3)
.map(String::toUpperCase)
.forEach(System.out::println);
🧠 Analogy
Concept | Analogy |
---|---|
Collection | A basket that holds fruits |
Stream | A conveyor belt processing each fruit one by one |
❓ Can I convert between them?
Yes!
- From
Collection
toStream
:
List<String> list = List.of("a", "b");
Stream<String> stream = list.stream();
From Stream
to Collection
:
List<String> result = stream.collect(Collectors.toList());
🛠 When to Use What?
Use Case | Use |
---|---|
Store and access data | Collection |
Mutate or sort data manually | Collection |
Process data in a pipeline | Stream |
Apply functional operations | Stream (map , filter , reduce , etc.) |
Handle big/lazy data sources | Stream (possibly infinite, like generate ) |
✅ Summary
Aspect | Collection | Stream |
---|---|---|
Purpose | Stores and organizes data | Processes data in a pipeline |
Reusability | ✅ Reusable | ❌ One-time use |
Data holding | ✅ Holds all elements in memory | ❌ No storage — views/flows over a source |
Operations | CRUD (add/remove/search) | Functional (map/filter/reduce) |
Evaluation | Eager | Lazy (until terminal operation is called) |